32bit/64bit環境におけるデータ型の範囲とサイズ(バイト単位)とビット幅の一覧表です。
一般的な32/64bit環境であれば、long型以外の型については両環境で共通のサイズとなります。long型のサイズについては、32ビット環境では4byte(32bit)、64ビット環境では8byte(64bit)で表現されますが、ただし、64bit版Windowsで採用されているデータモデル「LLP64」ではlong型のサイズがint型と同等の4byte(32bit)になる点に注意が必要です。
文字型
型名 | サイズ | ビット幅 | 範囲 |
---|---|---|---|
char | 1 | 8bit | -128 〜 127(符号無しの場合は0 〜 255)※1 |
signed char | 1 | 8bit | -128 〜 127 |
unsigned char | 1 | 8bit | 0 〜 255 |
整数型
型名 | サイズ | ビット幅 | 範囲 |
---|---|---|---|
short | 2 | 16bit | -32768 〜 32767 |
unsigned short | 2 | 16bit | 0 〜 65535 |
int | 4 | 32bit | -2147483648 〜 2147483647 |
unsigned int | 4 | 32bit | 0 〜 4294967295 |
32bit環境、一部の64bit環境【IP64, LLP64(Win64)】※2 | |||
long | 4 | 32bit | -2147483648 〜 2147483647 |
unsigned long | 4 | 32bit | 0 〜 4294967295 |
64bit環境【SILP64, ILP64, LP64(UNIX/Linux, macOS/iOS)】※2 | |||
long | 8 | 64bit | -9223372036854775808 〜 9223372036854775807 |
unsigned long | 8 | 64bit | 0 〜 18446744073709551615 |
型名 | サイズ | ビット幅 | 範囲 |
---|---|---|---|
long long ※3 | 8 | 64bit | -9223372036854775808 〜 9223372036854775807 |
unsigned long long ※3 | 8 | 64bit | 0 〜 18446744073709551615 |
浮動小数点数型
型名 | サイズ | ビット幅 | 範囲 |
---|---|---|---|
float | 4 | 32bit | 1.17549e-38 〜 3.40282e+38(±10-38 〜 1038) |
double | 8 | 64bit | 2.22507e-308 〜 1.79769e+308(±10-308 〜 10308) |
long double | 16 | 128bit | 3.3621e-4932 〜 1.18973e+4932(±10-4932 〜 104932) |
※ float(単精度浮動小数点数型)/ double(倍精度浮動小数点数型)/ long double(四倍精度浮動小数点数)
データモデル別 データサイズ対応表
データ型のサイズは、OSが採用するデータモデルによって大きく変化します。以下の表は、データモデル別のデータサイズをビット単位で表したものです。
データモデル | short | int | long | long long | void * | 処理系 |
---|---|---|---|---|---|---|
LLP64 | 16 | 32 | 32 | 64 | 64 | Microsoft Win64 |
LP64 | 16 | 32 | 64 | 64 | 64 | 一般的なUnix系OS (Linux、macOS/iOS、等) |
IP64 | 16 | 64 | 32 | 64 | 64 | |
ILP64 | 16 | 64 | 64 | 64 | 64 | |
SILP64 | 64 | 64 | 64 | 64 | 64 | |
ILP32 | 16 | 32 | 32 | 64 | 32 | 一般的な32bit環境 |
LP32 | 16 | 16 | 32 | 64 | 32 |
int型のサイズについて
一般的にint型のサイズは4バイト(32bit)であり、最大値は2147483647、最小値は-2147483648となっています。
ただし仕様上のint型のサイズは必ずしも4byte(32bit)として厳格に定められているわけではなく、実際に特殊な環境ではint型が32bit以外のビット幅で表現されている場合もあります。(参考:データモデル別 データサイズ対応表)
long型のサイズについて
32bit環境や一部の64bit環境(LLP64(Win64))ではlong/unsigned long型のサイズおよび最大値と最小値がint/unsigned int型と同等のサイズになるため注意してください。
なお64bit版のWindowsではLLP64が採用されましたが、これには32bit版のコードとのソース互換性がある程度保たれる効果があるため、両環境の移行時に際する混乱も最小限に抑えることができるという利点があります。
OS環境別のサイズについては「# データモデル別 データサイズ対応表」が参考になります。
long long型のサイズについて
long long型やunsigned long long型は32bit/64bitいずれの環境でも64bit以上のビット幅で表現されます。多くの環境ではlong型と同じ64bit幅で表現されることが多いですが、基本的には処理系依存のサイズとなります。
char型の符号について
char型はコンパイル環境によって符号付きと符号無しに分かれることがあります。多くの環境では符号付き(signed char)と同等になっていることがほとんどですが、コンパイル環境/開発環境によっては符号無しになることもあります。
char型が符号付きか符号無しかどうかを判定するためには、limits.h
ヘッダのCHAR_MIN
マクロ定数の値を調べる方法が一般的です。charが符号無しの場合には本定数の値は0
となります。char型が符号付きの場合はCHAR_MINの値は符号付きcharの最小値-128
(SCHAR_MIN)と同値になります。
if (CHAR_MIN) {
puts("char型は符号付きです");
} else {
puts("char型は符号無しです");
}
なお、コンパイラによっては、charが符号無しかどうかを判定するための定義済みマクロとして__CHAR_UNSIGNED__
が利用できる場合もあります。
コンパイル時に明示的にchar型の符号を指定する際には、符号付きの場合にはコンパイルオプションとして-fsigned-char
、符号無しの場合は-funsigned-char
を指定することができます。