数据类型 | 32位 | 64位 |
---|---|---|
int | 4 | 4字节 |
short int | 2 | 2字节 |
unsigned int | 4 | 4字节 |
int* | 4 | 8字节 |
char | 1 | 1字节 |
char* | 4 | 8字节 |
float | 4 | 4字节 |
double | 8 | 8字节 |
long | 4 | 4字节 |
long long | 8 | 8字节 |
unsigned long | 4 | 4字节 |
可见,两者环境下的数据类型所占字节数都是一样的;
唯一不同的是:指针类型
32位:32位的寻址空间是2^32, 即32个bit,因此指针类型占4个字节
64位:指针类型占8个字节
关于平常争议的long字节是8还是4
这涉及到编译器用的数据模型的问题。
绝大部分64位的Unix,linux都是使用的LP64模型;
64位的Windows使用的是LLP64(long long and point 64)模型。
下表是不同模型下数据类型的 bits,可见即使机器位数相同,数据字节也不一定一样,红色标注就是怪咖。
(I = int , L = long, P = pointer, 数字 = bits)
Datatype | LP64(linux) | ILP64 | LLP64(windows) | ILP32(linux/windows) | LP32 |
---|---|---|---|---|---|
char | 8 | 8 | 8 | 8 | 8 |
short | 16 | 16 | 16 | 16 | 16 |
int | 32 | 64 | 32 | 32 | 16 |
long | 64 | 64 | 32 | 32 | 32 |
long long | 64 | 64 | 64 | 64 | 64 |
pointer | 64 | 64 | 64 | 32 | 32 |