C語言基礎

設定「char c = 200;」並以 printf 的 %d 顯示 c 的程式,以 x86-64 Linux 用的 gcc 編譯執行時顯示 −56,以 Arm Linux 用的 gcc 則顯示200。產生差異的理由為下列何者?

  1. AArm 是大端序,因此位元組的順序被反過來讀取
  2. B沒有加 signed 或 unsigned 的 char 是有號還是無號由處理系統決定,x86-64 為有號,Arm 為無號
  3. Cx86-64 的 char 是16位元,其高位位元被當作符號處理
查看答案與解析

正確答案:B. 沒有加 signed 或 unsigned 的 char 是有號還是無號由處理系統決定,x86-64 為有號,Arm 為無號

沒有加 signed 或 unsigned 的 char 是有號還是無號,標準並未規定,而是交由處理系統決定(實作定義)。在 x86-64 的 Linux 中,char 是有號的,只能表示 −128~127,放入200會變成 200 − 256 = −56。在 Arm 或 RISC-V 的 Linux 中,char 是無號的,200 會原樣放入。處理位元組資料時,應使用 unsigned char 或 uint8_t,明確指定有無符號。

  • A. Arm 的 Linux 一般是小端序,而且1位元組 char 的值與位元組順序無關。
  • B. 正確。char 有無符號是實作定義,x86-64 為有號,Arm 的 Linux 為無號。
  • C. char 在所有處理系統中都是1位元組,在 x86-64 上是8位元。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 執行上方在 && 與 || 的右邊寫了 b++ 的程式碼時的輸出,下列何者正確?
  2. 執行上方含有沒有 break 之 case 的 switch 敘述時的輸出,下列何者正確?
  3. 執行上方程式時的輸出,下列何者正確?
  4. 連續呼叫上方的函式 f 三次時,第3次的回傳值為下列何者?
  5. C語言中,(1) 在函式中沒有加 static 宣告的區域變數、(2) 以 malloc 配置的區域、(3) 在函式外宣告的變數,各自存在的期間(生命週期)的組合,下列何者正確?