2011-02-17 3 views
8

질문은 분명합니다.Qt가 컨테이너 클래스에 부호있는 정수 유형을 사용하는 이유는 무엇입니까?

분명히 부정적인 indeces가 그들과 함께 사용되는 용기에서 사용할 수 없기 때문에 이것이 편리 할 것이라고 생각한 이유가 궁금합니다 (예 : QList's docs 참조).

나는 그들이 어떤 미친 형태의 색인 생성을 허용하고 싶다고 생각했으나 지원되지 않는 것처럼 보입니까?

또한 서명 된/서명되지 않은 형식 (MSVC)의 캐스팅 및 비교에 대한 (정확한) 컴파일러 경고를 생성합니다. 그냥 어떤 이유로 디자인으로 STL과 호환되지 않는 것 같다

...

답변

4

때문에, 현실적으로, 당신은 일반적으로 당신이 부정적인 임시직을 만들 수 있음을 의미 지수에 대한 연산을 수행하고자합니다. 기본 인덱싱 유형이 부호가없는 경우이 작업은 분명히 어렵습니다.

부호없는 숫자를 사용하는 적절한 시간은 모듈러스 산술입니다. "unsined"를 일종의 계약 지정자로 사용하면 "0 [...] 범위의 숫자는 단지 서투른 것이고 너무 거칠어서 유용하지 않습니다.

고려 : 숫자가 1에서 10 사이의 양수 여야한다는 생각을 나타 내기 위해 사용해야하는 유형은 무엇입니까? 왜 0 ... 2^x가 더 특별한 범위입니까?

+2

"only"는 다소 강한 식별자입니다. – Sapph

+0

하나의 특별한 경우는 [signed/unsigned] char의 배열입니다. 이 경우 modulus 산술은 2의 보수 표현 플랫폼에서 동일한 결과를 산출합니다. –

+1

그러나 서명 된 유형이 일반적으로 사용되는 역할에서 과도하게 문서화되는 점에 동의합니다. –

8

나는 Chris의 추론에 깊이 공감하고 있지만, 나는 (적어도 부분적으로 나는 악마의 지지자와 놀고있다) 여기에 동의하지 않을 것이다. 크기에 부호없는 유형을 사용하는 데는 아무런 문제가 없으며 어떤 경우에는 이점이 있습니다.

서명 된 크기 형식에 대한 Chris의 정당성은 자연스럽게 배열 인덱스로 사용되며 배열 인덱스에 대해 산술을 수행하고 산술적으로 음수 인 임시 값을 만들 수 있다는 것입니다.

비교할 때 값을 올바르게 해석하는 한 서명되지 않은 산술로 인해 문제가 발생하지 않습니다. 부호없는 정수의 오버플로 동작이 완전히 지정되었으므로 일시적으로 음수 범위 (또는 거대한 양수)로 오버플로되는 경우 비교가 수행되기 전에 오류가 발생하지 않는 한 오류가 발생하지 않습니다.

부호없는 산술의 오버플로 동작으로 인해 특정 범위 검사가 다른 비교를 두 번 요구하는 단일 비교로 표현되기 때문에 때때로 오버플로 동작이 바람직합니다. 내가 x의 범위 [a,b]에있는 모든 값이 서명되지 않은 경우 확인하고 싶은 경우에, 나는 간단하게 수행 할 수 있습니다

서명 변수가 작동하지 않습니다
if (x - a < b) { 
} 

; 이러한 범위 검사는 크기와 배열 오프셋에서 매우 일반적입니다.

앞서 언급했듯이 오버 플로우 산술로 결과가 정의됩니다. 인덱스 산술이 부호있는 형식을 오버플로하면 해당 동작은 구현에 따라 정의됩니다. 프로그램을 이식성있게 만드는 방법은 없습니다. 서명되지 않은 형식을 사용하면이 문제가 해결됩니다. 틀림없이 이것은 오프셋에만 적용되지만 일부 용도에서는 문제가됩니다.

기본적으로 부호없는 유형에 대한 이의 제기는 과장됩니다.실제 문제는 대부분의 프로그래머가 작성한 코드의 정확한 의미에 대해 실제로 생각하지 않는다는 것이며 작은 정수 값의 경우 서명 된 유형이 직감에 더 가깝게 작동합니다. 그러나 데이터 크기는 매우 빠르게 증가합니다. 버퍼 또는 데이터베이스를 처리 할 때 우리는 종종 "작은"범위를 벗어납니다. 서명 된 오버플로는 부호없는 오버플로보다 올바르게 처리하기에 훨씬 문제가 있습니다. 해결책은 "부호없는 유형을 사용하지 마십시오"가 아니라 "작성한 코드를 신중하게 생각하고 이해하도록하십시오"입니다.

+0

저는 서명되지 않은 인덱스로 가능한 게으른 언더 플로우 체크 스타일을 정말 좋아합니다. –

+0

+1 if (x-a user763305

관련 문제