数据类型所占的字节数探究
首先明确:操作系统的寻址能力和机器的地址总线宽度以及数据总线宽度都有关。地址总线宽度决定了机器中总共有多少物理地址,数据总线决定了OS能访问这些物理地址中的多少部分。
- 32位系统的数据总线和地址总线宽度都为32位,因此,一次最多能够处理32位的数据,最多能够访问4GB的内存地址空间。
- 64位系统的数据总线和地址总线宽度都为64位,因此,一次最多能够处理64位的数据,最多能够访问的内存地址空间是16EB
因此,为了提高数据传输效率,尽量让数据类型大小在数据总线宽度内,以便一次访存就能读取完整。对于指针,也能说明当前OS的地址总线宽度是多少。
因此,32位OS中指针和数据类型通常占用4个字节(4*8B=32bits),64位OS中指针和数据类型通常占用8个字节(8*8B=64bits)。这也造成了相同数据类型在不同系统下的范围不同。
数据类型 | 32位OS | 64位OS |
---|---|---|
char | 1B | 1B |
short | 2B | 2B |
int | 4B | 大多数4B,少数8B |
float | 4B | 4B |
double | 8B | 8B |
long | 4B | 4B |
指针 | 4B | 8B |
此外,数据类型占据的字节数还和编译器的数据模型相关,具体如下:
Datetype | LP64 | ILP64 | LLP64 | ILP32 | 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 | ||||
pointer | 64 | 64 | 64 | 32 | 32 |
-
一般情况下,windows64位一般使用LLP64模型
-
64位Unix,Linux使用的是LP64模型