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