如果在Linux下使用GCC編譯器執行下列程序,輸出結果為何?
#include<stdio.h> int main(){ char c=127; printf("%d",++c); printf("%d",++c); return 0; }
只是知道涉及到類型轉換、資料截斷填充。但不知道具體解釋?
原問題出處:Linux下C語言的幾道經典面試題
char 的長度是1 位元組,並且,大多數的機器都將其視為有符號數的,所以它的表示範圍是[-128, 127](參見《深入理解計算機系統》P27 ~P28)。所以,當你給 c 賦值 127 時,你執行了 ++c,那麼就會導致溢出,因為它只有一個位元組。
char
[-128, 127]
c
++c
在機器中表示127,變成二進制是這樣的01111111,可以看到,當你加1 之後,結果就變成了10000000,由於在計算機內部,負數是用補碼來表示的,所以就變成了-128。之後再 ++c,就是 -127 了。
01111111
10000000
至於不同的類型,其實在電腦內部表現的都是一樣的,都是一塊記憶體。所以類型不是限制。
這題考的是 編譯器,而不是語言。 定義3個變數:
編譯器
char c; // 表示一个 ascii字符 signed char s_c; //有符号 1字节 整数 unsigned char u_c; //无符号 1字节 整数
C語言裡,c 在參與計算時, c 轉為 s_c 還是 u_c ,是由編譯器來決定的。
gcc 認為 c 是 有符號的,後續的計算 和 輸出 都是以有符號數來處理。
char
的長度是1 位元組,並且,大多數的機器都將其視為有符號數的,所以它的表示範圍是[-128, 127]
(參見《深入理解計算機系統》P27 ~P28)。所以,當你給c
賦值 127 時,你執行了++c
,那麼就會導致溢出,因為它只有一個位元組。在機器中表示127,變成二進制是這樣的
01111111
,可以看到,當你加1 之後,結果就變成了10000000
,由於在計算機內部,負數是用補碼來表示的,所以就變成了-128。之後再++c
,就是 -127 了。至於不同的類型,其實在電腦內部表現的都是一樣的,都是一塊記憶體。所以類型不是限制。
這題考的是
編譯器
,而不是語言。定義3個變數:
C語言裡,c 在參與計算時, c 轉為 s_c 還是 u_c ,是由
編譯器
來決定的。gcc 認為 c 是 有符號的,後續的計算 和 輸出 都是以有符號數來處理。