C標準中並沒有具體規定哪個基本類型應該是多少字節數,但有幾條鐵定的原則(ANSI/ISO制訂的):
-
sizeof(short int)<=sizeof(int)
-
sizeof(int)<=sizeof(long int)
-
short int至少應爲16位(2字節)
-
long int至少應爲32位(4字節)
-
long long至少應爲64位(8字節)
因此每種數據類型具體的字節數與CPU位數、OS位數、編譯器位數都有關,但歸根結底是和編譯器位數有關。其中,編譯器又會涉及到一個重要概念——64位數據模型。
常見的64位數據模型有LP64、ILP64、SILP64、LLP64等。
不同模型可共存於同一操作系統,程序編譯時由編譯器在預編譯器底層選擇。
(1)char、float、double、long long
以上4種數據類型在不同位數編譯器與不同數據模型下的字節數均保持不變:
char/unsigned char | float | double | long long |
1 | 4 | 8 | 8 |
(2)指針(void*)
指針(void*)因爲要實現尋址的功能,其字節數與編譯器位數有關,與數據模型無關:
32位平臺(比如vs中的win32) | 64位平臺(比如vs中的x64) |
4 | 8 |
(3)short、int、long
short、int、long等數據類型在32位編譯平臺下,字節數分別爲2、4、4。
而在64位編譯器下,則會因爲64位數據模型的不同選擇而字節數不同:
Type \ Model | LP64 | ILP64 | SILP64 | LLP64 |
short | 2 | 2 | 8 | 2 |
int | 4 | 8 | 8 | 4 |
long | 8 | 8 | 8 | 4 |
在64位機器下的許多程序設計環境,
LP64 數據模型:“int”變量仍然是32位寬,不過“long”和指針是64位寬;
ILP64數據模型:"int"、"long"和指針3種數據類型都是64位寬;
SILP64數據類型:在ILP64數據模型的基礎上,連“short”變量也是64位寬;
LLP64數據模型:其維持32位代碼的兼容性,使int和long爲32位。
今天有許多64位編譯器使用LP64模型(包括Solaris、AIX、HP、Linux、Mac OS X、IBM z/OS原生編譯器)。
微軟的VC++編譯器使用LLP64模型。