【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位(數據類型)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章