詳解C++中基本資料型別位元組數
阿新 • • 發佈:2019-01-05
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模型。