在下面的代碼時,我運行它我得到y=-124
和z=4294967172
你能解釋我嗎? (經測試,如果x<128
心不是任何問題)獲取錯誤的字符數變量
char x=132;
signed y=x;
unsigned z=x;
cout<<y<<endl;
cout<<z<<endl;
在下面的代碼時,我運行它我得到y=-124
和z=4294967172
你能解釋我嗎? (經測試,如果x<128
心不是任何問題)獲取錯誤的字符數變量
char x=132;
signed y=x;
unsigned z=x;
cout<<y<<endl;
cout<<z<<endl;
char
是8位,所以,當你寫char x = 132
,實際上這樣做:
x = 1000 0100
signed int
和unsigned int
兩者都是32位,並且每當分配一個「較小」可變的入值系統使用符號擴展,即將符號位複製到左側的每一位。因此,該值變爲:
1111 1111 1111 1111 1111 1111 1000 0100
如果你把它解釋爲一個符號的值,它是-124,和作爲一個無符號值是4294967172.
此外,如果您在第一行定義char
爲unsigned
,你總是得到132,因爲符號擴展沒有爲無符號值完成。
哇謝謝,非常有趣的東西,我得到了這裏。也感謝詹姆斯麥克奈利斯完成答案,並告訴我解決這個問題的方法 – Arash 2012-01-08 10:23:28
第一行x爲10000100(132爲10000100b),它是機器中的-124值(參見here)。
所以在第二行y之後是-124。
第三行z之後是111 ... 1110000100b。高位有1,因爲你設置了一個負數,但是當你打印編譯器打印時,它是二進制值,因爲z是無符號的。
@iammilind:這是完全錯誤的。即使在'x'後面有未命名的填充字節,它們也不能以任何方式影響程序的語義。 – 2012-01-08 09:59:32