C/C++/Java/C#的基础类型模型的定义
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位指针类型
补充:软件开发 , C++ ,