【C言語/C++】データ型のサイズ・範囲の一覧【32bit/64bit環境】

32bit/64bit環境におけるデータ型の範囲とサイズ(バイト単位)とビット幅の一覧表です。

一般的な32/64bit環境であれば、long型以外の型については両環境で共通のサイズとなります。long型のサイズについては、32ビット環境では4byte(32bit)、64ビット環境では8byte(64bit)で表現されますが、ただし、64bit版Windowsで採用されているデータモデル「LLP64」ではlong型のサイズがint型と同等の4byte(32bit)になる点に注意が必要です。

文字型

型名サイズビット幅範囲
char18bit-128 〜 127(符号無しの場合は0 〜 255)※1
signed char18bit-128 〜 127
unsigned char18bit0 〜 255

整数型

型名サイズビット幅範囲
short216bit-32768 〜 32767
unsigned short216bit0 〜 65535
int432bit-2147483648 〜 2147483647
unsigned int432bit0 〜 4294967295
32bit環境、一部の64bit環境【IP64, LLP64(Win64)】※2
long432bit-2147483648 〜 2147483647
unsigned long432bit0 〜 4294967295
64bit環境【SILP64, ILP64, LP64(UNIX/Linux, macOS/iOS)】※2
long864bit-9223372036854775808 〜 9223372036854775807
unsigned long864bit0 〜 18446744073709551615
型名サイズビット幅範囲
long long ※3864bit-9223372036854775808 〜 9223372036854775807
unsigned long long ※3864bit0 〜 18446744073709551615

浮動小数点数型

型名サイズビット幅範囲
float 432bit1.17549e-38 〜 3.40282e+38(±10-38 〜 1038
double 864bit2.22507e-308 〜 1.79769e+308(±10-308 〜 10308
long double 16128bit3.3621e-4932 〜 1.18973e+4932(±10-4932 〜 104932)

※ float(単精度浮動小数点数型)/ double(倍精度浮動小数点数型)/ long double(四倍精度浮動小数点数)

データモデル別 データサイズ対応表

データ型のサイズは、OSが採用するデータモデルによって大きく変化します。以下の表は、データモデル別のデータサイズをビット単位で表したものです。

データモデルshortintlonglong longvoid *処理系
LLP641632326464Microsoft Win64
LP641632646464一般的なUnix系OS (Linux、macOS/iOS、等)
IP641664326464
ILP641664646464
SILP646464646464
ILP321632326432一般的な32bit環境
LP321616326432

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を指定することができます。

広告
広告