数据类型所占的字节数探究

数据类型所占的字节数探究

首先明确:操作系统的寻址能力和机器的地址总线宽度以及数据总线宽度都有关。地址总线宽度决定了机器中总共有多少物理地址,数据总线决定了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;
}
posted @ 2023-06-07 08:40  3的4次方  阅读(61)  评论(0编辑  收藏  举报