Linux下C語言的一道經典面試題
过去多啦不再A梦
过去多啦不再A梦 2017-06-26 10:59:02
0
2
1155

如果在Linux下使用GCC編譯器執行下列程序,輸出結果為何?

#include<stdio.h>
int main(){
    char c=127;
    printf("%d",++c);
    printf("%d",++c);
    return 0;
}

只是知道涉及到類型轉換、資料截斷填充。但不知道具體解釋?

原問題出處:Linux下C語言的幾道經典面試題

过去多啦不再A梦
过去多啦不再A梦

全部回覆(2)
巴扎黑

char 的長度是1 位元組,並且,大多數的機器都將其視為有符號數的,所以它的表示範圍是[-128, 127](參見《深入理解計算機系統》P27 ~P28)。所以,當你給 c 賦值 127 時,你執行了 ++c,那麼就會導致溢出,因為它只有一個位元組。

在機器中表示127,變成二進制是這樣的01111111,可以看到,當你加1 之後,結果就變成了10000000,由於在計算機內部,負數是用補碼來表示的,所以就變成了-128。之後再 ++c,就是 -127 了。

至於不同的類型,其實在電腦內部表現的都是一樣的,都是一塊記憶體。所以類型不是限制。

Peter_Zhu

這題考的是 編譯器,而不是語言。
定義3個變數:

char c; // 表示一个 ascii字符
signed char s_c;   //有符号 1字节 整数
unsigned char u_c; //无符号 1字节 整数

C語言裡,c 在參與計算時, c 轉為 s_c 還是 u_c ,是由編譯器來決定的。

gcc 認為 c 是 有符號的,後續的計算 和 輸出 都是以有符號數來處理。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板