Was ist die Ausgabe, wenn Sie den GCC-Compiler verwenden, um das folgende Programm unter Linux auszuführen?
#include<stdio.h>
int main(){
char c=127;
printf("%d",++c);
printf("%d",++c);
return 0;
}
Wissen Sie nur, dass es sich um Typkonvertierung, Datenkürzung und -füllung handelt. Aber Sie kennen die konkrete Erkl?rung nicht?
Ursprüngliche Fragequelle: Mehrere klassische Interviewfragen in C-Sprache unter Linux
char
的長(zhǎng)度是 1 字節(jié),并且,大多數(shù)的機(jī)器都將其視為有符號(hào)數(shù)的,所以它的表示范圍是 [-128, 127]
(參見《深入理解計(jì)算機(jī)系統(tǒng)》P27~P28)。所以,當(dāng)你給 c
賦值 127 時(shí),你執(zhí)行了 ++c
,那么就會(huì)導(dǎo)致溢出,因?yàn)樗挥幸粋€(gè)字節(jié)。
在機(jī)器中表示 127,變成二進(jìn)制是這樣的 01111111
,可以看到,當(dāng)你加 1 之后,結(jié)果就變成了 10000000
,由于在計(jì)算機(jī)內(nèi)部,負(fù)數(shù)是用補(bǔ)碼來(lái)表示的,所以就變成了 -128。之后再 ++c
,就是 -127 了。
至于不同的類型,其實(shí)在計(jì)算機(jī)內(nèi)部表現(xiàn)的都是一樣的,都是一塊內(nèi)存。所以類型不是限制。
這題考的是 編譯器
,而不是語(yǔ)言。
定義3個(gè)變量:
char c; // 表示一個(gè) ascii字符
signed char s_c; //有符號(hào) 1字節(jié) 整數(shù)
unsigned char u_c; //無(wú)符號(hào) 1字節(jié) 整數(shù)
C語(yǔ)言里,c 在參與計(jì)算時(shí), c 轉(zhuǎn)為 s_c 還是 u_c ,是由編譯器
來(lái)決定的。
gcc 認(rèn)為 c 是 有符號(hào)的,后續(xù)的計(jì)算 和 輸出 都是按有符號(hào)數(shù)進(jìn)行處理。