我不明白,爲什麼在下面的代碼最終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);
我不明白,爲什麼在下面的代碼最終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);
在char
類型是有符號大多數的實現,所以它的範圍從-128
到127
。
這意味着,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);
它可能是打印-1。這是因爲如你預期
c = (c | j);
將評估作爲
c = (0 | 255) = (0 | 0xFF) = 0xFF
,但由於c
簽訂後,0xFF
將是-1,而不是255。如果更改c
到unsigned char
它會打印255,因爲你的想象。
嘗試用unsigned char c
更換char c
。基本上char類型支持-128到127之間的值。你的結果比支持的範圍大並且溢出。
默認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
將被打印。
它是什麼打印?如果將「j」更改爲char,會發生什麼情況? – Joe
你不需要演員(我討厭演員)。編譯器將調用之前自動轉換'printf'提供它知道的參數是函數的變量參數的一部分 - 即:只要你有'#包括'在你的代碼 –
pmg