C99からサイズ固定の整数型が定義できるようになったわけですが、そのあたりの整理。
前提
Cは伝統的にint
やlong
が何バイトかの保証がありません1。これらの整数型に対してはCPUアーキテクチャごとに最適なサイズが割り振られるので、Cプログラマはintが何バイトだろうと動くコードを書かねばなりません2。
とはいえサイズを明示したいこともあるよね、ということでC99からサイズ固定の型が登場しました。
- int8_t
- int16_t
- int32_t
- int64_t
- uint8_t
- uint16_t
- uint32_t
- uint64_t
符号あり・符号なしの8,16,32,64bitの整数型が明示的に使えます。やりましたね!
これらの型は<inttypes.h>
で定義されています。
printfで使いたい
これらサイズ固定の整数型をprintfで使いたいときのために、適切な指示子に展開するマクロが存在します。
# include <stdio.h>
# include <inttypes.h>
int main(void) {
int32_t i = 32;
printf("%"PRIx32"\n", i); // 20
return 0;
}
普段なら%x
と書くはずのところで、マクロPRIx32
を利用しています。このうちx
の部分は普段の指示子と同様d
(符号あり10進)、X
およびx
(16進)、o
(8進)、u
(符号なし10進)が利用できます。最後の数字は整数型のサイズを指定します。