001111111 11111111 11111111 11111011 입니다.
따라서 이를 16진수로 하면? 0x3FFFFFFB가 됩니다.
이걸 signed int 타입 %d로 인쇄하면
최상위 비트가 0이므로 양수가 되고 값은?
으악 엄청 큰수가 되지요...
얼마냐면 계산기로 해보니 1073741819 가 되네요...
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[추가 답변]
그럼 왜 0x3FFFFFFB 를 signed int로 할때는
2의 보수를 취하지 않느냐고 하셨는데요...
2진수 음수표현을 좀더 정확히 공부하셔야 겠네요...
위의 수를 signed int로 표시하려면 즉, %d로 인쇄하라는 것은
위의 내용을 signed int로 간주하라는 겁니다.
그런데 위의 값을 이진수로 표현한것을 보면
001111111 11111111 11111111 11111011 입니다.
여기서 보시면 최상위 비트가 1이 아니라 0임을 알 수 있죠?
즉, 최상위 비트가 1이라면 이수는 음수라는 겁니다.
그러나 최상위 비트가 0이므로 이 수는 양수이고
그렇다면 값은 그냥 위의 값을 10진수로 표현한면 됩니다.
만약 위의 값이 최상위 비트가 1이었다면
프로그램에서는 이것이 음수다 라고 알게되죠
그러면 값을 알기 위하여 전체에 2의 보수를 구하여
값을 알아냅니다. (물론 마이너스이므로 -XXX 가 되겠죠)
그럼 다음으로 연습을 합시다.
지금부터 임시로 int를 8비트라고 합시다.
원래는 32비트 이지만...
현재 메모리의 내용이 11111100 할때
위의 것을 %d로 인쇄하면 뭐가 될까요?
최상위 비트가 1이므로 음수이고 값은 2의 보수를 취하므로
00000100입니다. 10진수로는 4입니다.
따라서 -4 라는 수가 되지요...
이걸 %u로 인쇄하여 봅시다. (%u는 unsigned int로 간주하는 겁니다)
그러면 최상위 비트가 1이지만 이것을 부호가 없는 정수로 보므로
최상위 비트는 부호가 아니라 값으로서의 1입니다.
그러므로 값은 10진수로 하여보면 10진수로 252 가 됩니다.
그럼 이번엔 메모리 내용이 00001111이라고 합시다
위의것을 %d로 인쇄하면 signed int로 간주되는데
최상위 비트(부호비트)가 0이므로 양수입니다.
이 경우는 2의 보수를 취하지 않고 그냥 전체가 값이 됩니다.
왜냐하면 양수를 2의 보수를 취해놓으면 반드시 최상위 비트는
1이 되기 때문에 음수로서의 원래 값을 구하려면
전체를 다시 2의 보수를 취해야 하지요...
그러나 최상위 비트가 0이면 이건 원래부터 양수이고
2의 보수로 만든수가 아니므로 값은 그냥 취하는 겁니다.
그래서 그 값은 15가 됩니다.
위의것을 unsigned int로 하면?
무조건 최상위 비트가 뭐든지 간에 양수이므로
값은 똑같이 15가 됩니다.
이유를 아시겠나요?
추가 질의에 답이 될런지요?
더 궁금하시면 쪽지요망
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
signed 타입과 unsigned 타입의 우측쉬프트는 최상위 비트 조작이 다름을
기억해야 합니다. 가끔 실수하거든요...
도움이 되시길...