2011-08-27 32 views
4

我不明白,爲什麼在下面的代碼最終printf不打印255OR操作使用C不工作

char c; 
c = c & 0; 
printf("The value of c is %d", (int)c); 
int j = 255; 
c = (c | j); 
printf("The value of c is %d", (int)c); 
+0

它是什麼打印?如果將「j」更改爲char,會發生什麼情況? – Joe

+0

你不需要演員(我討厭演員)。編譯器將調用之前自動轉換'printf'提供它知道的參數是函數的變量參數的一部分 - 即:只要你有'#包括'在你的代碼 – pmg

回答

16

char類型是有符號大多數的實現,所以它的範圍從-128127

這意味着,11111111(這是255寫成二進制)等於-1。 (因爲它表示爲在two's complement的值)

爲了得到你所期望的,你需要聲明c作爲unsigned char,像這樣:

unsigned char c = 0; 
int j = 255; 
c = (c | j); 
printf("The value of c is %d", (int)c); 
+4

一個合適的地方了'char'簽署在許多實現中,但C標準允許實現具有'char'無符號。 – dreamlax

+0

@dreamlax:如果上面的程序不打印'255',那麼它顯然不能無符號。 :) –

+1

當然,但是你的答案看起來像'char'只能*被簽名。 – dreamlax

5

它可能是打印-1。這是因爲如你預期

c = (c | j); 

將評估作爲

c = (0 | 255) = (0 | 0xFF) = 0xFF 

,但由於c簽訂後,0xFF將是-1,而不是255。如果更改cunsigned char它會打印255,因爲你的想象。

2

嘗試用unsigned char c更換char c。基本上char類型支持-128到127之間的值。你的結果比支持的範圍大並且溢出。

0

默認char 是C. signed char 如果你想255要打印,然後使用unsigned char 但是我解釋輸出的signed char 使這一概念變得清晰脈絡。 如果你寫j=127然後將打印127爲位表示是01111111 但是,如果你寫j=128 然後將打印-128 因爲位表示01111111增加1而成爲10000000 現在,如果你寫j=255 那麼該位表示是11111111,以便打印機打印-1 如果你寫j=256 然後將打印0 因爲當位表示11111111加1變成1億。但只有1個字節分配給所以A characher變量最左邊的位不被存儲並且位表示爲beco MES 00000000 此外如果寫j=257 那麼它也溢出並將以位表示的情況下成爲00000001和1將被打印。