我写了这段代码来了解位移。令我惊讶的是,即使我宣称x
为unsigned int
,输出包含一个负数,即当最左边的位被设置为1.我的问题:为什么?我认为unsigned int
从来没有消极。每sizeof(x)
,x
是4个字节宽。为什么一个声明为unsigned int的变量产生一个负值?
以下是代码片段:
int main(void)
{
unsigned int x;
x = 1;
for (int i = 0; i < 32; i++)
{
printf("2^%i = %i\n", i, x);
x <<= 1;
}
return 0;
}
这里是输出:
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
2^9 = 512
2^10 = 1024
2^11 = 2048
2^12 = 4096
2^13 = 8192
2^14 = 16384
2^15 = 32768
2^16 = 65536
2^17 = 131072
2^18 = 262144
2^19 = 524288
2^20 = 1048576
2^21 = 2097152
2^22 = 4194304
2^23 = 8388608
2^24 = 16777216
2^25 = 33554432
2^26 = 67108864
2^27 = 134217728
2^28 = 268435456
2^29 = 536870912
2^30 = 1073741824
2^31 = -2147483648
因为您将它打印为有符号值。 –
简短的回答是因为'printf()'没有做任何类型检查。 –
https://stackoverflow.com/questions/14181691/why-does-printf-show-negative-values-for-unsigned-int –