C言語の基礎
「char c = 200;」とした c を printf の %d で表示するプログラムを、x86-64 の Linux 向けの gcc でコンパイルして実行すると −56、Arm の Linux 向けの gcc では 200 と表示された。違いが生じる理由として正しいものはどれか。
- AArm はビッグエンディアンなので、バイトの並びが逆に読まれるから
- Bsigned も 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ビットです。