2012-01-08 51 views
0

在下面的代碼時,我運行它我得到y=-124z=4294967172 你能解釋我嗎? (經測試,如果x<128心不是任何問題)獲取錯誤的字符數變量

char x=132; 
signed y=x; 
unsigned z=x; 
cout<<y<<endl; 
cout<<z<<endl; 
+2

@iammilind:這是完全錯誤的。即使在'x'後面有未命名的填充字節,它們也不能以任何方式影響程序的語義。 – 2012-01-08 09:59:32

回答

3

char是8位,所以,當你寫char x = 132,實際上這樣做:

x = 1000 0100 

signed intunsigned int兩者都是32位,並且每當分配一個「較小」可變的入值系統使用符號擴展,即將符號位複製到左側的每一位。因此,該值變爲:

1111 1111 1111 1111 1111 1111 1000 0100 

如果你把它解釋爲一個符號的值,它是-124,和作爲一個無符號值是4294967172.

此外,如果您在第一行定義charunsigned ,你總是得到132,因爲符號擴展沒有爲無符號值完成。

+0

哇謝謝,非常有趣的東西,我得到了這裏。也感謝詹姆斯麥克奈利斯完成答案,並告訴我解決這個問題的方法 – Arash 2012-01-08 10:23:28

2

char s爲只有8位,這意味着他們只能容納256個值包括0您正在使用符號的字符,這意味着一半的值保留爲負數,使最大正值爲127.

+0

謝謝,但是z值如何呢?它的無符號值,但它沒有顯示132 – Arash 2012-01-08 09:56:16

+1

你得到的z的值看起來是無符號的32位整數的最大值減去x的值。 – Rabbit 2012-01-08 10:01:08

1

第一行x爲10000100(132爲10000100b),它是機器中的-124值(參見here)。
所以在第二行y之後是-124。
第三行z之後是111 ... 1110000100b。高位有1,因爲你設置了一個負數,但是當你打印編譯器打印時,它是二進制值,因爲z是無符號的。