나는이 작은 보석 뒤에 숨어있는 매우 불쾌한 벌레를 추적했습니다. C ++ 사양에 따라 서명 된 오버플로는 정의되지 않은 동작이지만 값이 bit-width로 확장 될 때 오버플로가 발생할 때만 발생한다는 것을 알고 sizeof(int)
있습니다. 내가 이해했듯이, 증가하는 char
것은 sizeof(char) < sizeof(int)
. 그러나 그것은 불가능한 가치를 c
얻는 방법을 설명하지 않습니다 . 8 비트 정수로서 비트 너비보다 큰 값을 어떻게 보유 할 수 있습니까?c
암호
// Compiled with gcc-4.7.2
#include <cstdio>
#include <stdint.h>
#include <climits>
int main()
{
int8_t c = 0;
printf("SCHAR_MIN: %i\n", SCHAR_MIN);
printf("SCHAR_MAX: %i\n", SCHAR_MAX);
for (int32_t i = 0; i <= 300; i++)
printf("c: %i\n", c--);
printf("c: %i\n", c);
return 0;
}
산출
SCHAR_MIN: -128
SCHAR_MAX: 127
c: 0
c: -1
c: -2
c: -3
...
c: -127
c: -128 // <= The next value should still be an 8-bit value.
c: -129 // <= What? That's more than 8 bits!
c: -130 // <= Uh...
c: -131
...
c: -297
c: -298 // <= Getting ridiculous now.
c: -299
c: -300
c: -45 // <= ..........
ideone에서 확인하십시오.
printf()
변환합니까?