2013-07-25 7 views
9

は私の問題のコードです:符号なし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と等しくないのですか?

私はLinux SUSEでgccを使用しています。

答えて

12

整数のプロモーションに噛まれてしまいます。あなたが行うと:

~b == c 

bc両方がintに昇進します。それはあなたが本当にやっている意味:

~0x000000ff == 0 

比較して終わること:一致しない

0xffffff00 == 0 

。それはあなたのchar型が署名されているので、あなたの最初のケースで動作し、プロモーションに符号拡張します:式~bでは、オペランドがintに昇格し、何かのようになります。そのため、標準的な一体型プロモーションの

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

あなたはその証拠にいくつかのコードを使用することはできますか?想像するのは難しい –

+5

*あなたの*コードがそれを証明します。それはCの仕組みです。 –

+0

OK、あなたは正しいです。 –

2

0x000000FFのように。結果は整数0xFFFFFF00になります。

あなたはunsigned charに戻って結果を変換する必要があります。

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

+1であるが、4ビットの 'char'型は標準では許可されていない。 –

+0

うん、それは動作します! –

+0

@CarlNorum:私の表記では、 'F'は256番目のシンボルです:-) –

関連する問題