yohhoyの日記

技術的メモをしていきたい日記

Linuxとビット幅指定整数型

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

*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."