C/C++僅僅定義基本數據類型的關系(字長:CHAR<=SHORT<=INT<=LONG),並沒有嚴格定義它們的字長,根據編譯器的不同實現,它們的字長如下表所示:
DATETYPE
LP32
ILP32
LP64
ILP64
LLP64
JAVA
C#
CHAR
8
8
8
8
8
16
16
BYTE
N/A
N/A
N/A
N/A
N/A
8
8
SHORT
16
16
16
16
16
16
16
_INT32
N/A
32
N/A
N/A
N/A
N/A
N/A
INT
16
32
32
64
32
32
32
LONG
32
32
64
64
32
64
64
LONG LONG
64
64
64
64
64
N/A
N/A
POINTER
32
32
64
64
64
N/A
N/A
FLOAT
32
32
32
32
32
32
32
DOUBLE
64
64
64
64
64
64
64
BOOL
T/F
T/F
T/F
T/F
T/F
T/F
T/F
上表中,LP64、ILP64、LLP64是64位平台上字長的數據模型,ILP32和LP32是32位平台上字長的數據模型。
LP64指的是LONG/POINTER字長為64位;
ILP64指的是INT/LONG/POINT字長為64位;
LLP64指的是LONGLONG/POINTER字長為64位;
ILP32指的是INT/LONG/POINTER字長為32位;
LP32指的是LONG/POINT字長是32位的,INT字長為16位。
注1:32位Windows采用的是ILP32數據模型,64位Windows采用LLP64數據模型。
注2:32位的Linux/Unix使用ILP32數據模型,64位Linux/Unix使用LP64數據模型。
注3:為了增加代碼的移植性,打印無符號整形數,不管申明時是如何定義的,統一使用 %lu。
注4:為了保證平台的通用性,代碼中盡量不要使用long數據庫型。
注5:使用INT時也可以使用intptr_t來保證平台的通用性,它在不同的平台上編譯時長度不同,但都是標准的平台長度,比如:64位機器上長度為8字節,32位機器上長度為4字節。
注6:編寫代碼時要盡量使用sizeof來計算數據類型的大小。
注7:ssize_t和size_t分別是signsize_t和unsigned signed size of computer word size。它們也是表示計算機的字長,在32位機器上是int型,在64位機器上long型,從某種意義上來說它們等同於intptr_t和 uintptr_t。
WINDOWS下數據類型,定義如下:
類型
定義
類型
定義
DWORD32
32位無符號整數
DWORD64
64位無符號整數
INT32
32位有符號整數
UINT32
32位無符號整數
INT64
64位有符號整數
UINT64
64位無符號整數
LONG32
32位有符號整數
ULONG32
32位無符號整數
LONG64
64位有符號整數
ULONG64
64位無符號整數
DWORD_PTR
指針精度無符號長整型
HALF_PTR
指針大小的一半,有符號
UHALF_PTR
指針大小的一半,無符號
INT_PTR
指針進度有符號整數
UINT_PTR
指針進度無符號整數
LONG_PTR
指針進度的有符號長整型
ULONG_PTR
指針進度的無符號長整型
SIZE_T
指針可用的最大字節數
SSZIE_T
有符號SIZE_T
LPARAM
與LONG_PTR為同義詞
WPARM
與UINT_PTR為同義詞
POINTER_32
32位指針類型
POINTER_64
64位指針類型