2014-01-29 1 views
0

unsigned char에 대한 호기심이 있습니다. 나는 unsigned char에 대한 호기심이있다. 나는 서명되지 않은 숯에 대해 실수로 뺄셈 연산을 수행했습니다. 나는 그것을하기로되어 있지 않다는 것을 알고 있습니다. 그러나 나는 특정한 대답이 어떻게 왔는지에 관해 약간 궁금하다. 아무도 비트 수준에서 이것을 설명 할 수 있습니까? 부호없는 char에 대한 뺄셈 연산

unsigned char x = 150; 
unsigned char y = 229; 

unsigned char z = x - y; 

마침내 나는 당신이 150에서 229를 뺄 경우 2008 년

+2

'z'의 타입이 당신의 코드에서'unsigned char'가 아닌'int' 였는지 확신합니까? 그렇다면 결과를 재현하는 완전하고 편집 가능한 예를 게시하십시오. – Praetorian

+0

죄송합니다. 서명되지 않은 char입니다. – Varo

답변

4

부호없는 정수 산술 모듈로 2^N, n은 정수의 특정 크기의 값 표현의 비트 수이다 의 법규를 준수하며, 부호 선언.

(C++ 11 표준, 3.9.1.5) 대부분의 플랫폼

unsigned char는 8 비트이기 때문에, 그 결과는 150-229 개조 256 = 256 = -79 개조 177

1

예, 당신은 -79와 끝까지 Visual Studio에서이 코드를 실행하고 디버깅

동안 Z 177을 얻었다. 그러나 대상으로 인해 0..255 (8 비트라고 가정) 범위로 제한되므로 범위가 유지되도록 주변이 랩 어라운드됩니다. 따라서 기본적으로 256-79에 추가하면 177이됩니다. 당신에게 서명 값 -1을 줄 것 즉

, 9 - 10은 실제로 당신에게 8 비트 unsigned char에 대한 255을 제공합니다. 마찬가지로 9 - 11254입니다.

는 그것은 다시 0-255을 다음 감싸고 있기 때문에 당신에게 6을 제공 255 + 7으로, 또한 다르지 없습니다.

이제 더 큰 데이터 유형으로 값을 올릴 수 있고 그 다음 빼기를 수행 한 다음 결과가 잘리는 경우 규칙이 보다 복잡합니다. 그러나 수학적으로, 첫 번째 단락이 정확합니다.

+1

당신의 추론은'z'의 타입이'unsigned char' 인 경우에만 작동합니다. 그리고 마지막 부분은 완전히 잘못되었습니다. 산술 연산자에 대한 피연산자는 산술 연산이 수행되기 전에 필수 승진 *을 거칩니다. [여기에 예제가 있습니다] (http://coliru.stacked-crooked.com/a/929ac351d5f62e99) 이것이 어떻게 작동하는지. – Praetorian

+1

결국,'z'는 결국'unsigned char'이므로, 답의 첫 부분이 정확합니다. 필수 절 차가 계속 적용되기 때문에 마지막 단락은 여전히 ​​잘못되었습니다. 산술 연산자는 'int'보다 작은 연산을 수행하지 않습니다. 실제로, 컴파일러는 아마도 결과가'unsigned char'에 위치한다는 것을 보게 될 것이고'char'에 연산이 더 효율적이라고 가정하고 판촉을하지 않을 것입니다. – Praetorian