C言語の基礎

「char c = 200;」とした c を printf の %d で表示するプログラムを、x86-64 の Linux 向けの gcc でコンパイルして実行すると −56、Arm の Linux 向けの gcc では 200 と表示された。違いが生じる理由として正しいものはどれか。

  1. AArm はビッグエンディアンなので、バイトの並びが逆に読まれるから
  2. Bsigned も 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言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. && と || の右側に b++ を書いた上のコードを実行したときの出力として、正しいものはどれか。
  2. break のない case を含む上の switch 文を実行したときの出力として、正しいものはどれか。
  3. 上のプログラムを実行したときの出力として、正しいものはどれか。
  4. 上の関数 f を3回続けて呼び出したとき、3回目の戻り値として正しいものはどれか。
  5. C言語で、(1) 関数の中で static を付けずに宣言した局所変数、(2) malloc で確保した領域、(3) 関数の外で宣言した変数、のそれぞれが存在する期間(寿命)の組み合わせとして正しいものはどれか。