1. 程式人生 > >詳解C++中基本資料型別位元組數

詳解C++中基本資料型別位元組數

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位資料模型有LP64ILP64、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模型

維基百科:64位(資料型別)