C語言基礎
設定「char c = 200;」並以 printf 的 %d 顯示 c 的程式,以 x86-64 Linux 用的 gcc 編譯執行時顯示 −56,以 Arm Linux 用的 gcc 則顯示200。產生差異的理由為下列何者?
- AArm 是大端序,因此位元組的順序被反過來讀取
- B沒有加 signed 或 unsigned 的 char 是有號還是無號由處理系統決定,x86-64 為有號,Arm 為無號
- 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位元。