2、C++ 设计
1.字节和字长 指针
字节,八位就是一个字节,是固定概念。字长是指计算机一次能处理的二进制数据的长度,是一个非固定的概念。例如,8位计算机的字长为8,即一个字节, 32位计算机的字长位32,即4个字节,同理,64位计算机的字长为64,即8字节。 编译器
2.char类型始终是一个字节长,即8位。 it
3.int、short int和long int 编译
一般int为一个字长,short为半个字长,long为一个或2个字长(在32位机器中为一个字长)。 table
4.浮点型float、双精度double、和长双精度long double 程序设计
典型状况下,float 为一个字,double是两个字,long double为三个或四个字。 硬件
C/C++仅仅定义了这些基本数据类型之间的关系,并无定义严格定义它们的字长。在不一样的平台上,根据编译器不一样的实现,它们的字长以下表所示: 数据类型
数据类型 二进制 |
LP64 |
ILP64 |
LLP64 |
ILP32 |
LP32 |
char |
8 |
8 |
8 |
8 |
8 |
short |
16 |
16 |
16 |
16 |
16 |
_int32 |
N/A |
32 |
N/A |
N/A |
N/A |
int |
32 |
64 |
32 |
32 |
16 |
long |
64 |
64 |
32 |
32 |
32 |
long long |
N/A |
N/A |
64 |
N/A |
N/A |
pointer |
64 |
64 |
64 |
32 |
32 |
在这张表中,LP64,ILP64,LLP64是64位平台上的字长模型,ILP32和LP32是32位平台上的字长模型。
LP64意思是long和pointer是64位,ILP64指 int,long,pointer是64位,LLP指long long和pointer是32-bit的。ILP32指int,long和pointer是32位的,LP32指long和pointer是32位的。
32位Windows采用的是ILP32数据模型,64位Windows采用的是LLP64数据模型。
因此,Windows上的32位程序设计和64位程序设计最大的不一样(也就是IP32和LLP64的不一样),就在于指针的长度不一样??由32位变成了64位。
Win32 API在不少状况下,都须要将整数转换成指针或者相反。在 32 位的硬件上不会有问题,其中指针的大小和整数的大小是相同的,但在 64 位的硬件上却彻底不同。