我寫了這段代碼來了解位移。令我驚訝的是,即使我宣稱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 –