C言語の基礎

組込みのプログラムで、32ビットの周辺レジスタの値を入れる変数を、unsigned int ではなく stdint.h の uint32_t で宣言することが多い。主な理由として正しいものはどれか。

  1. Auint32_t は、値が最大値を超えたときに0に戻らず、最大値で止まる(飽和する)から
  2. Buint32_t で宣言した変数は、コンパイラの最適化で読み書きが省かれなくなるから
  3. Cunsigned int の大きさは処理系によって違うが、uint32_t はちょうど32ビットの符号なし整数と決まっているから
答えと解説を見る

正解:C. unsigned int の大きさは処理系によって違うが、uint32_t はちょうど32ビットの符号なし整数と決まっているから

stdint.h の uint8_t、uint16_t、uint32_t、int32_t などは、ビット数が名前のとおりに決まった整数型(固定幅の整数型)です。unsigned int は16ビットのことも32ビットのこともあるので、レジスタの幅に合わせたい場面や、通信のデータの形を決める場面で固定幅の型を使うと、別のCPUに移しても意味が変わりません。uint32_t は、ほかの符号なしの整数型と同じく、あふれると 2³² で割った余りの値になります。読み書きを省かせないためには、型とは別に volatile を付けます。

  • A. 符号なしの整数型はあふれると0の側に戻ります。最大値で止めるには、飽和の処理を自分で書きます。
  • B. 読み書きを省かせないのは volatile の働きで、uint32_t という型とは関係ありません。
  • C. 正しい。どの処理系でも同じ32ビットの幅で扱えます。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

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

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

  1. 整数どうしの割り算を含む上のコードを実行したときの出力として、正しいものはどれか。
  2. 前置と後置の ++ を使った上のコードを実行したときの出力として、正しいものはどれか。
  3. if 文の条件に = を書いた上のコードを実行したときの出力として、正しいものはどれか。
  4. レジスタの値 reg のビット2が1かどうかを調べるつもりで、上のコードを書いた。実行したときの結果として、正しいものはどれか。
  5. uint8_t は8ビットの符号なし整数型である。上のコードを実行したときの出力として、正しいものはどれか。