首頁  >  問答  >  主體

Linux下C語言的一道經典面試題

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

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

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

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

过去多啦不再A梦过去多啦不再A梦2693 天前1119

全部回覆(2)我來回復

  • 巴扎黑

    巴扎黑2017-06-26 11:01:02

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

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

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

    回覆
    0
  • 天蓬老师

    天蓬老师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 是 有符號的,後續的計算 和 輸出 都是以有符號數來處理。

    回覆
    0
  • 取消回覆