나는 Chris의 추론에 깊이 공감하고 있지만, 나는 (적어도 부분적으로 나는 악마의 지지자와 놀고있다) 여기에 동의하지 않을 것이다. 크기에 부호없는 유형을 사용하는 데는 아무런 문제가 없으며 어떤 경우에는 이점이 있습니다.
서명 된 크기 형식에 대한 Chris의 정당성은 자연스럽게 배열 인덱스로 사용되며 배열 인덱스에 대해 산술을 수행하고 산술적으로 음수 인 임시 값을 만들 수 있다는 것입니다.
비교할 때 값을 올바르게 해석하는 한 서명되지 않은 산술로 인해 문제가 발생하지 않습니다. 부호없는 정수의 오버플로 동작이 완전히 지정되었으므로 일시적으로 음수 범위 (또는 거대한 양수)로 오버플로되는 경우 비교가 수행되기 전에 오류가 발생하지 않는 한 오류가 발생하지 않습니다.
부호없는 산술의 오버플로 동작으로 인해 특정 범위 검사가 다른 비교를 두 번 요구하는 단일 비교로 표현되기 때문에 때때로 오버플로 동작이 바람직합니다. 내가 x
의 범위 [a,b]
에있는 모든 값이 서명되지 않은 경우 확인하고 싶은 경우에, 나는 간단하게 수행 할 수 있습니다
서명 변수가 작동하지 않습니다
if (x - a < b) {
}
; 이러한 범위 검사는 크기와 배열 오프셋에서 매우 일반적입니다.
앞서 언급했듯이 오버 플로우 산술로 결과가 정의됩니다. 인덱스 산술이 부호있는 형식을 오버플로하면 해당 동작은 구현에 따라 정의됩니다. 프로그램을 이식성있게 만드는 방법은 없습니다. 서명되지 않은 형식을 사용하면이 문제가 해결됩니다. 틀림없이 이것은 오프셋에만 적용되지만 일부 용도에서는 문제가됩니다.
기본적으로 부호없는 유형에 대한 이의 제기는 과장됩니다.실제 문제는 대부분의 프로그래머가 작성한 코드의 정확한 의미에 대해 실제로 생각하지 않는다는 것이며 작은 정수 값의 경우 서명 된 유형이 직감에 더 가깝게 작동합니다. 그러나 데이터 크기는 매우 빠르게 증가합니다. 버퍼 또는 데이터베이스를 처리 할 때 우리는 종종 "작은"범위를 벗어납니다. 서명 된 오버플로는 부호없는 오버플로보다 올바르게 처리하기에 훨씬 문제가 있습니다. 해결책은 "부호없는 유형을 사용하지 마십시오"가 아니라 "작성한 코드를 신중하게 생각하고 이해하도록하십시오"입니다.
"only"는 다소 강한 식별자입니다. – Sapph
하나의 특별한 경우는 [signed/unsigned] char의 배열입니다. 이 경우 modulus 산술은 2의 보수 표현 플랫폼에서 동일한 결과를 산출합니다. –
그러나 서명 된 유형이 일반적으로 사용되는 역할에서 과도하게 문서화되는 점에 동의합니다. –