数据类型所占的字节数探究
数据类型所占的字节数探究
首先明确:操作系统的寻址能力和机器的地址总线宽度以及数据总线宽度都有关。地址总线宽度决定了机器中总共有多少物理地址,数据总线决定了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模型
测试例程:
#include <stdio.h> int main(void) { printf("当前主机字节序: %d\n", dGetHostByteOrder()); printf("char %d\n", sizeof(char)); printf("short %d\n", sizeof(short)); printf("int %d\n", sizeof(int)); printf("long %d\n", sizeof(long)); printf("long long %d\n", sizeof(long long)); printf("float %d\n", sizeof(float)); printf("double %d\n", sizeof(double)); return 0; }
本文作者:3的4次方
本文链接:https://www.cnblogs.com/3to4/p/17462281.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步