【C言語】inttypes.hで環境に依存せずに整数型を使う【標準ライブラリ】

【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_tuintptr_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言語プログラムの可搬性を向上させることができます。

コメントは受け付けていません。