C99標準ヘッダ<stdint.h>で定義されるビット幅指定の整数型と、Linux Standard Base(LSB)によるプロセッサ・アーキテクチャ別の規定。
x86(IA-32)とx86-64/AMD64における整数型ビット幅は下表の通り(太字はアーキテクチャでビット幅が異なる整数型)。
型名 | IA-32 | AMD64 | C99仕様上の要件 |
---|---|---|---|
(u)intptr_t |
32 | 64 | ポインタ型と互換性のある整数型*1 |
(u)int8_t |
8 | 8 | 厳密に8bit幅の整数型 |
(u)int16_t |
16 | 16 | 厳密に16bit幅の整数型 |
(u)int32_t |
32 | 32 | 厳密に32bit幅の整数型 |
(u)int64_t |
64 | 64 | 厳密に64bit幅の整数型 |
(u)int_least8_t |
8 | 8 | 8bit以上で最小ビット幅の整数型 |
(u)int_least16_t |
16 | 16 | 16bit以上で最小ビット幅の整数型 |
(u)int_least32_t |
32 | 32 | 32bit以上で最小ビット幅の整数型 |
(u)int_least64_t |
64 | 64 | 64bit以上で最小ビット幅の整数型 |
(u)int_fast8_t |
8 | 8 | 8bit以上で最も高速な整数型 |
(u)int_fast16_t |
32 | 64 | 16bit以上で最も高速な整数型 |
(u)int_fast32_t |
32 | 64 | 32bit以上で最も高速な整数型 |
(u)int_fast64_t |
64 | 64 | 64bit以上で最も高速な整数型 |
(u)intmax_t |
64 | 64 | 最大ビット幅の整数型 |
注意:本記事の内容はLSB準拠環境における規定にすぎない。C99言語仕様にのみ従う環境では、各整数型の要件のみが保証される。特に、(u)intN_t
型が提供されるか否かは処理系による。*2
プロセッサ・アーキテクチャによらない型定義は、LSB Core 3.2にて下記の通り定義される。
typedef signed char int8_t; typedef short int16_t; typedef int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef signed char int_least8_t; // 8bit typedef short int int_least16_t; // 16bit typedef int int_least32_t; // 32bit typedef unsigned char uint_least8_t; // 8bit typedef unsigned short uint_least16_t; // 16bit typedef unsigned int uint_least32_t; // 32bit typedef signed char int_fast8_t; // 8bit typedef unsigned char uint_fast8_t; // 8bit
Intel x86アーキテクチャ(IA-32)の場合、LSB Core(IA32) 3.2にて下記の通り定義される。
typedef long long int int64_t; typedef unsigned long long int uint64_t; typedef long long int intmax_t; typedef unsigned long long int uintmax_t; typedef int intptr_t; // 32bit typedef unsigned int uintptr_t; // 32bit typedef long long int int_least64_t; // 64bit typedef unsigned long long int uint_least64_t; // 64bit typedef int int_fast16_t; // 32bit typedef int int_fast32_t; // 32bit typedef long long int int_fast64_t; // 64bit typedef unsigned int uint_fast16_t; // 32bit typedef unsigned int uint_fast32_t; // 32bit typedef unsigned long long int uint_fast64_t; // 64bit
Intel x86-64/AMD64アーキテクチャの場合、LSB Core(AMD64) 3.2にて下記の通り定義される。
typedef long int int64_t; typedef unsigned long int uint64_t; typedef long int intmax_t; typedef unsigned long int uintmax_t; typedef long int intptr_t; // 64bit typedef unsigned long int uintptr_t; // 64bit typedef long int int_least64_t; // 64bit typedef unsigned long int uint_least64_t; // 64bit typedef long int int_fast16_t; // 64bit typedef long int int_fast32_t; // 64bit typedef long int int_fast64_t; // 64bit typedef unsigned long int uint_fast16_t; // 64bit typedef unsigned long int uint_fast32_t; // 64bit typedef unsigned long int uint_fast64_t; // 64bit
関連URL
- cppreference Fixed width integer types
- cpprefjp cstdint
*1:C99 7.18.1.4:"(snip) integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer:"
*2:厳密には「処理系に該当ビット幅の整数型が存在する場合は (u)intN_t 型を定義すること(shall)」という強い要請になっている。C99 7.18.1.1/p3:"These types are optional. However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two's complement representation, it shall define the corresponding typedef names."