最終更新日時: 2026年06月15日 14時22分22秒 (JST)
Akira Takahashi が更新

履歴 編集

<cstdint>

# cstdint(C++11)

`<cstdint>`ヘッダでは、ビット数が規定された整数型の別名、およびマクロを提供する。これらの機能は、`std`名前空間に属することを除いてC言語の標準ライブラリ`<stdint.h>`ヘッダと同じである。

本ヘッダはフリースタンディング環境でも提供される。

## 符号付き整数型

型 | 説明 | 対応バージョン
--- | --- | ---
`int8_t` | 8ビット幅の符号付き整数(実装するかどうかは処理系定義) | C++11
`int16_t` | 16ビット幅の符号付き整数(実装するかどうかは処理系定義) | C++11
`int32_t` | 32ビット幅の符号付き整数(実装するかどうかは処理系定義) | C++11
`int64_t` | 64ビット幅の符号付き整数(実装するかどうかは処理系定義) | C++11
`int_fast8_t` | 少なくても8ビット幅を持ち、演算が高速な符号付き整数 | C++11
`int_fast16_t` | 少なくても16ビット幅を持ち、演算が高速な符号付き整数 | C++11
`int_fast32_t` | 少なくても32ビット幅を持ち、演算が高速な符号付き整数 | C++11
`int_fast64_t` | 少なくても64ビット幅を持ち、演算が高速な符号付き整数 | C++11
`int_least8_t` | 少なくても8ビット幅を持つ、最小の符号付き整数 | C++11
`int_least16_t` | 少なくても16ビット幅を持つ、最小の符号付き整数 | C++11
`int_least32_t` | 少なくても32ビット幅を持つ、最小の符号付き整数 | C++11
`int_least64_t` | 少なくても64ビット幅を持つ、最小の符号付き整数 | C++11
`intmax_t` | 最も大きい符号付き整数型 | C++11
`intptr_t` | ポインタサイズの符号付き整数型(実装するかどうかは処理系定義) | C++11

## 符号なし整数型

型 | 説明 | 対応バージョン
--- | --- | ---
`uint8_t` | 8ビット幅の符号なし整数(実装するかどうかは処理系定義) | C++11
`uint16_t` | 16ビット幅の符号なし整数(実装するかどうかは処理系定義) | C++11
`uint32_t` | 32ビット幅の符号なし整数(実装するかどうかは処理系定義) | C++11
`uint64_t` | 64ビット幅の符号なし整数(実装するかどうかは処理系定義) | C++11
`uint_fast8_t` | 少なくても8ビット幅を持ち、演算が高速な符号なし整数 | C++11
`uint_fast16_t` | 少なくても16ビット幅を持ち、演算が高速な符号なし整数 | C++11
`uint_fast32_t` | 少なくても32ビット幅を持ち、演算が高速な符号なし整数 | C++11
`uint_fast64_t` | 少なくても64ビット幅を持ち、演算が高速な符号なし整数 | C++11
`uint_least8_t` | 少なくても8ビット幅を持つ、最小の符号なし整数 | C++11
`uint_least16_t` | 少なくても16ビット幅を持つ、最小の符号なし整数 | C++11
`uint_least32_t` | 少なくても32ビット幅を持つ、最小の符号なし整数 | C++11
`uint_least64_t` | 少なくても64ビット幅を持つ、最小の符号なし整数 | C++11
`uintmax_t` | 最も大きい符号なし整数型 | C++11
`uintptr_t` | ポインタサイズの符号なし整数型(実装するかどうかは処理系定義) | C++11

以下のマクロは、整数型の限界値を表す。

## 符号付き整数型用の限界値マクロ

マクロ | 説明 | 対応バージョン
--- | --- | ---
`INT8_MIN` | `int8_t`の最小値(実装するかどうかは処理系定義) | C++11
`INT8_MAX` | `int8_t`の最大値(実装するかどうかは処理系定義) | C++11
`INT16_MIN` | `int16_t`の最小値(実装するかどうかは処理系定義) | C++11
`INT16_MAX` | `int16_t`の最大値(実装するかどうかは処理系定義) | C++11
`INT32_MIN` | `int32_t`の最小値(実装するかどうかは処理系定義) | C++11
`INT32_MAX` | `int32_t`の最大値(実装するかどうかは処理系定義) | C++11
`INT64_MIN` | `int64_t`の最小値(実装するかどうかは処理系定義) | C++11
`INT64_MAX` | `int64_t`の最大値(実装するかどうかは処理系定義) | C++11
`INT_FAST8_MIN` | `int_fast8_t`の最小値 | C++11
`INT_FAST8_MAX` | `int_fast8_t`の最大値 | C++11
`INT_FAST16_MIN` | `int_fast16_t`の最小値 | C++11
`INT_FAST16_MAX` | `int_fast16_t`の最大値 | C++11
`INT_FAST32_MIN` | `int_fast32_t`の最小値 | C++11
`INT_FAST32_MAX` | `int_fast32_t`の最大値 | C++11
`INT_FAST64_MIN` | `int_fast64_t`の最小値 | C++11
`INT_FAST64_MAX` | `int_fast64_t`の最大値 | C++11
`INT_LEAST8_MIN` | `int_least8_t`の最小値 | C++11
`INT_LEAST8_MAX` | `int_least8_t`の最大値 | C++11
`INT_LEAST16_MIN` | `int_least16_t`の最小値 | C++11
`INT_LEAST16_MAX` | `int_least16_t`の最大値 | C++11
`INT_LEAST32_MIN` | `int_least32_t`の最小値 | C++11
`INT_LEAST32_MAX` | `int_least32_t`の最大値 | C++11
`INT_LEAST64_MIN` | `int_least64_t`の最小値 | C++11
`INT_LEAST64_MAX` | `int_least64_t`の最大値 | C++11
`INTMAX_MIN` | `intmax_t`の最小値 | C++11
`INTMAX_MAX` | `intmax_t`の最大値 | C++11
`INTPTR_MIN` | `intptr_t`の最小値(実装するかどうかは処理系定義) | C++11
`INTPTR_MAX` | `intptr_t`の最大値(実装するかどうかは処理系定義) | C++11
`PTRDIFF_MIN` | `ptrdiff_t`の最小値 | C++11
`PTRDIFF_MAX` | `ptrdiff_t`の最大値 | C++11
`SIG_ATOMIC_MIN` | `sig_atomic_t`の最小値 | C++11
`SIG_ATOMIC_MAX` | `sig_atomic_t`の最大値 | C++11
`WCHAR_MIN` | `wchar_t`の最小値 | C++11
`WCHAR_MAX` | `wchar_t`の最大値 | C++11
`WINT_MIN` | `wint_t`の最小値 | C++11
`WINT_MAX` | `wint_t`の最大値 | C++11

## 符号なし整数型用の限界値マクロ

マクロ | 説明 | 対応バージョン
--- | --- | ---
`UINT8_MAX` | `uint8_t`の最大値(実装するかどうかは処理系定義) | C++11
`UINT16_MAX` | `uint16_t`の最大値(実装するかどうかは処理系定義) | C++11
`UINT32_MAX` | `uint32_t`の最大値(実装するかどうかは処理系定義) | C++11
`UINT64_MAX` | `uint64_t`の最大値(実装するかどうかは処理系定義) | C++11
`UINT_FAST8_MAX` | `uint_fast8_t`の最大値 | C++11
`UINT_FAST16_MAX` | `uint_fast16_t`の最大値 | C++11
`UINT_FAST32_MAX` | `uint_fast32_t`の最大値 | C++11
`UINT_FAST64_MAX` | `uint_fast64_t`の最大値 | C++11
`UINT_LEAST8_MAX` | `uint_least8_t`の最大値 | C++11
`UINT_LEAST16_MAX` | `uint_least16_t`の最大値 | C++11
`UINT_LEAST32_MAX` | `uint_least32_t`の最大値 | C++11
`UINT_LEAST64_MAX` | `uint_least64_t`の最大値 | C++11
`UINTMAX_MAX` | `uintmax_t`の最大値 | C++11
`UINTPTR_MAX` | `uintptr_t`の最大値(実装するかどうかは処理系定義) | C++11
`SIZE_MAX` | `size_t`の最大値 | C++11

## 幅マクロ

以下のマクロは、各整数型の幅 (値ビット数) を表す。

マクロ | 説明 | 対応バージョン
--- | --- | ---
`INT8_WIDTH` | `int8_t`の幅(実装するかどうかは処理系定義) | C++26
`INT16_WIDTH` | `int16_t`の幅(実装するかどうかは処理系定義) | C++26
`INT32_WIDTH` | `int32_t`の幅(実装するかどうかは処理系定義) | C++26
`INT64_WIDTH` | `int64_t`の幅(実装するかどうかは処理系定義) | C++26
`UINT8_WIDTH` | `uint8_t`の幅(実装するかどうかは処理系定義) | C++26
`UINT16_WIDTH` | `uint16_t`の幅(実装するかどうかは処理系定義) | C++26
`UINT32_WIDTH` | `uint32_t`の幅(実装するかどうかは処理系定義) | C++26
`UINT64_WIDTH` | `uint64_t`の幅(実装するかどうかは処理系定義) | C++26
`INT_FAST8_WIDTH` | `int_fast8_t`の幅 | C++26
`INT_FAST16_WIDTH` | `int_fast16_t`の幅 | C++26
`INT_FAST32_WIDTH` | `int_fast32_t`の幅 | C++26
`INT_FAST64_WIDTH` | `int_fast64_t`の幅 | C++26
`UINT_FAST8_WIDTH` | `uint_fast8_t`の幅 | C++26
`UINT_FAST16_WIDTH` | `uint_fast16_t`の幅 | C++26
`UINT_FAST32_WIDTH` | `uint_fast32_t`の幅 | C++26
`UINT_FAST64_WIDTH` | `uint_fast64_t`の幅 | C++26
`INT_LEAST8_WIDTH` | `int_least8_t`の幅 | C++26
`INT_LEAST16_WIDTH` | `int_least16_t`の幅 | C++26
`INT_LEAST32_WIDTH` | `int_least32_t`の幅 | C++26
`INT_LEAST64_WIDTH` | `int_least64_t`の幅 | C++26
`UINT_LEAST8_WIDTH` | `uint_least8_t`の幅 | C++26
`UINT_LEAST16_WIDTH` | `uint_least16_t`の幅 | C++26
`UINT_LEAST32_WIDTH` | `uint_least32_t`の幅 | C++26
`UINT_LEAST64_WIDTH` | `uint_least64_t`の幅 | C++26
`INTMAX_WIDTH` | `intmax_t`の幅 | C++26
`UINTMAX_WIDTH` | `uintmax_t`の幅 | C++26
`INTPTR_WIDTH` | `intptr_t`の幅(実装するかどうかは処理系定義) | C++26
`UINTPTR_WIDTH` | `uintptr_t`の幅(実装するかどうかは処理系定義) | C++26
`PTRDIFF_WIDTH` | `ptrdiff_t`の幅 | C++26
`SIZE_WIDTH` | `size_t`の幅 | C++26
`SIG_ATOMIC_WIDTH` | `sig_atomic_t`の幅 | C++26
`WCHAR_WIDTH` | `wchar_t`の幅 | C++26
`WINT_WIDTH` | `wint_t`の幅 | C++26

## バージョン情報マクロ

マクロ | 説明 | 対応バージョン
--- | --- | ---
`__STDC_VERSION_STDINT_H__` | `<cstdint>`が提供するC標準ライブラリ機能のバージョン (`202311L`) | C++26

## 符号付き整数型用の定数値マクロ

以下のマクロは、各整数型の定数値を表す関数マクロである。
例： `int8_t x = INT8_C(1);`

マクロ | 説明 | 対応バージョン
--- | --- | ---
`INT8_C(n)` | 8ビット幅を持つ、符号付き整数型の定数値(実装するかどうかは処理系定義) | C++11
`INT16_C(n)` | 16ビット幅を持つ、符号付き整数型の定数値(実装するかどうかは処理系定義) | C++11
`INT32_C(n)` | 32ビット幅を持つ、符号付き整数型の定数値(実装するかどうかは処理系定義) | C++11
`INT64_C(n)` | 64ビット幅を持つ、符号付き整数型の定数値(実装するかどうかは処理系定義) | C++11
`INTMAX_C(n)` | 最も大きい符号付き整数型の定数値 | C++11

## 符号なし整数型用の定数値マクロ

マクロ | 説明 | 対応バージョン
--- | --- | ---
`UINT8_C(n)` | 8ビット幅を持つ、符号なし整数型の定数値(実装するかどうかは処理系定義) | C++11
`UINT16_C(n)` | 16ビット幅を持つ、符号なし整数型の定数値(実装するかどうかは処理系定義) | C++11
`UINT32_C(n)` | 32ビット幅を持つ、符号なし整数型の定数値(実装するかどうかは処理系定義) | C++11
`UINT64_C(n)` | 64ビット幅を持つ、符号なし整数型の定数値(実装するかどうかは処理系定義) | C++11
`UINTMAX_C(n)` | 最も大きい符号なし整数型の定数値 | C++11

## 備考

### `__STDC_LIMIT_MACROS`, `__STDC_CONSTANT_MACROS` マクロについて

C99 の 7.18.3 `<stdint.h>` についての脚注で、同ヘッダを C++ でコンパイルする場合に限界値マクロ、定数値マクロを得るためにはこれらのマクロを事前に定義する必要があるものとされていた。

> Footnote 219, 220: C++ implementations should define these macros only when `__STDC_LIMIT_MACROS` is defined before `<stdint.h>` is included.

> Footnote 222: C++ implementations should define these macros only when `__STDC_CONSTANT_MACROS` is defined before `<stdint.h>` is included.

しかしその後の C 規格改定でこの脚注は削除され、 C11 では触れられていない。 C++11 は（ C++14 も） C99 を参照規格としているが、 18.4.1 [cstdint.syn] p2 に注釈として、これらのマクロは採用されていないことが明記されている。

> The macros defined by `<cstdint>` are provided unconditionally. In particular, the symbols `__STDC_LIMIT_MACROS` and `__STDC_CONSTANT_MACROS` (mentioned in footnotes 219, 220, and 222 in the C standard) play no role in C++.

おそらく上記 C99 の脚注のため、 C++ 処理系によってはヘッダ `<stdint.h>` および `<cstdint>` での限界値マクロ、定数値マクロの提供にこれらマクロの定義が必要となっているかもしれない。（特に C++03 対応の処理系が拡張として C99 由来のこれらヘッダを提供していた場合など。）

- glibc に対するバグ報告（修正は 2013/05/21 ） Bug 15366 – Per C11 and C++11, `<stdint.h>` should not look at `__STDC_LIMIT_MACROS` or `__STDC_CONSTANT_MACROS`
- What do __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS mean? - Stack Overflow

## バージョン

### 言語

- C++11

## 参照

- N1568 Proposed additions to TR-1 to improve compatibility with C99
- N1835 `<stdint.h>` for C++
- P3348R4 C++26 should refer to C23 not C17
  - C++26がC23を参照するようになり、各整数型の幅を表すマクロと`__STDC_VERSION_STDINT_H__`が追加された