【C言語】inttypes.hで環境に依存せずに整数型を使う【標準ライブラリ】
inttypes.hの使い方と典型的な利用例
inttypes.hとは
inttypes.h
はC言語の標準ヘッダファイルの1つで、主に整数型の可搬性を向上させるために使用されます。
環境に依存せずに特定のビット幅を持つ整数型を使いたい場合や、フォーマット指定子を用いて安全に入出力したい場合に便利です。
固定幅整数型
inttypes.h
は、固定幅の整数型を提供する stdint.h
を拡張したものです。
例えば、環境によって int
が 16bit だったり 32bit だったりすることがありますが、
固定幅整数型を使えばビット幅を明確に指定できます。
int8_t
: 8ビット符号付き整数uint8_t
: 8ビット符号なし整数int16_t
: 16ビット符号付き整数uint16_t
: 16ビット符号なし整数int32_t
: 32ビット符号付き整数uint32_t
: 32ビット符号なし整数int64_t
: 64ビット符号付き整数uint64_t
: 64ビット符号なし整数
最小値・最大値マクロ
inttypes.h
では、各固定幅整数型に対応する最小値・最大値のマクロが定義されています。
#include <inttypes.h>
#include <stdio.h>
int main() {
printf("int16_t の最小値: %" PRId16 "\n", INT16_MIN);
printf("int16_t の最大値: %" PRId16 "\n", INT16_MAX);
return 0;
}
フォーマット指定子
通常の printf
では %d
や %u
を使いますが、固定幅整数を扱う場合は
inttypes.h
で定義されたマクロを使うことで環境依存の問題を防げます。
#include <inttypes.h>
#include <stdio.h>
int main() {
int32_t num = 123456;
printf("32ビット整数の値: %" PRId32 "\n", num);
return 0;
}
スキャンフォーマット指定子
scanf
で固定幅整数型の入力を受け取る場合も、専用のフォーマット指定子を使用します。
#include <inttypes.h>
#include <stdio.h>
int main() {
int64_t num;
printf("64ビット整数を入力: ");
scanf("%" SCNd64, &num);
printf("入力された数: %" PRId64 "\n", num);
return 0;
}
ポインタ整数型
intptr_t
と uintptr_t
は、ポインタを整数として扱うための型です。
例えば、ポインタのアドレスを整数として格納したい場合に便利です。
#include <inttypes.h>
#include <stdio.h>
int main() {
int x = 42;
intptr_t ptr_as_int = (intptr_t)&x;
printf("ポインタを整数として出力: %" PRIdPTR "\n", ptr_as_int);
return 0;
}
文字列→整数変換
inttypes.h
には、文字列を整数に変換する関数群も含まれています。
例えば、strtoimax
を使えば、任意のビット幅の整数に変換できます。
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "123456";
intmax_t num = strtoimax(str, NULL, 10);
printf("変換結果: %" PRIdMAX "\n", num);
return 0;
}
使用例まとめ
ここまでに紹介した例をまとめると、inttypes.h
は以下の用途に便利です。
- 固定幅整数型の使用 (
int32_t
,uint64_t
など) - 可搬性のあるフォーマット指定子 (
PRId32
,SCNd64
など) - ポインタを整数として扱う (
intptr_t
,uintptr_t
) - 安全な文字列→整数変換 (
strtoimax
,strtoumax
)
これらを適切に活用することで、C言語プログラムの可搬性を向上させることができます。