爲什麼執行此操作時會得到負數?如何通過位移將unsigned int轉換爲負數?
unsigned int a = 1 << 31;
printf("%d",a);
我已經檢查過我的電腦上的整數大小,它是4字節。所以我的整數由32位組成,並且向左移動31次,直到最重要的位。這意味着它應該是正數,但我總是負面的。
我能得到什麼:-2147483648
我所期待的:一些正數(大概1073741824)
缺少什麼我在這裏?
爲什麼執行此操作時會得到負數?如何通過位移將unsigned int轉換爲負數?
unsigned int a = 1 << 31;
printf("%d",a);
我已經檢查過我的電腦上的整數大小,它是4字節。所以我的整數由32位組成,並且向左移動31次,直到最重要的位。這意味着它應該是正數,但我總是負面的。
我能得到什麼:-2147483648
我所期待的:一些正數(大概1073741824)
缺少什麼我在這裏?
的問題不在於你是位轉移的事實。您只是不打印相應的格式。
%d或%i用於打印int,因此當您嘗試打印您的unsigned int時,它將轉換爲帶符號的int。
使用%u作爲printf格式字符串。
含義:
printf("%u",a);
除了你使用了錯誤的格式說明(中%d
代替%u
),你可能會由1移入標誌調用未定義行爲如this answer中所述,操作數爲int
。
要修復它,用一個無符號的文字:
unsigned int a = 1u << 31;
// ^
你打印出來的籤! –
'printf(「%u」,a);'應該修復它。 – 2016-11-29 16:05:01