C言語の基礎
組込みのプログラムで、32ビットの周辺レジスタの値を入れる変数を、unsigned int ではなく stdint.h の uint32_t で宣言することが多い。主な理由として正しいものはどれか。
- Auint32_t は、値が最大値を超えたときに0に戻らず、最大値で止まる(飽和する)から
- Buint32_t で宣言した変数は、コンパイラの最適化で読み書きが省かれなくなるから
- 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ビットの幅で扱えます。