2013-07-25 64 views
9

這裏是我的問題代碼:Unsigned char c = 255是否爲「11111111」?

#include "stdio.h" 

int main() 
{ 
     char a = -1; 
     unsigned char b = 255; 
     unsigned char c = 0; 
     if((~a) == c) 
       printf("OK 1"); 
     else 
       printf("bad 1"); 
     printf("\n"); 
     if((~b) == c) 
       printf("OK 2"); 
     else 
       printf("bad 2"); 
     printf("\n"); 
} 

我預計打印:

OK 1 

OK 2 

但是,我得到OK 1和2不好!

如果unsigned char b是255(11111111),那麼〜b應該是00000000。爲什麼它不等於c?

我使用gcc在Linux SUSE上工作。

回答

12

你正在被整數的促銷咬傷。當你這樣做:

~b == c 

bc都得到晉升爲int。這意味着你真的這樣做:

~0x000000ff == 0 

這結束了比較:

0xffffff00 == 0 

不匹配。它可以在你的第一個情況,因爲你的char類型的簽名,並在促進被符號擴展:

~a == c 
~(-1) == 0 
~0xffffffff == 0 
0 == 0 
+0

你可以使用一些代碼來證明?很難想象 –

+5

*您的*代碼證明了這一點。這只是C的工作方式。 –

+0

好的,你說得對。 –

2

由於標準積分促銷活動:在表達~b,操作數提升爲int,這可能是什麼像0x000000FF;結果是整數0xFFFFFF00

你必須將結果轉換回unsigned char

if ((unsigned char)(~b) == c) /* ... */ 
+0

+1,但標準不允許使用4位'char'類型。 –

+0

是的,它的工作!我得到期望的印刷品 –

+0

@CarlNorum:在我的符號中,'F'是第256個符號:-) –