为什么sizeof(int)在不同的操作系统中有所不同?

我想知道为什么int的大小取决于C&C ++中使用的操作系统。 如果指针的大小变化,但为什么整数的大小。 如果16位OS sizeof(int)= 2字节,则32位sizeof(int)= 4字节。 为什么这样?

谢谢。

根据C ++标准

1.7.1状态:

C ++内存模型中的基本存储单元是字节。 一个字节至少足以包含基本执行字符集的任何成员……

然后3.9.1.1陈述:

声明为字符(char)的对象应足够大,以存储实现的基本字符集的任何成员。

所以我们可以推断char实际上是一个字节。 最重要的是3.9.1.2还说:

有五个有符号整数类型:“signed char”,“short int”,“int”,“long int”和“long long int”。 在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间。 简单的int具有执行环境的体系结构所建议的自然大小; 提供其他有符号整数类型以满足特殊需求。

换句话说, int的大小是(a)保证至少是一个字节,(b)自然地与它运行的OS /硬件对齐,所以这些天最有可能是64位或(对于许多旧系统)32位。

为什么这样?

历史原因。

在1989年ANSI C标准和size_t出现之前, int是用于索引数组的类型。 mallocint为参数, strlen返回一个。 因此int必须足够大以索引任何数组,但小到足以不会导致过多的开销。 对于文件偏移量,通常较大的类型(如longtypedef to off_t

在PDP-11上 ,C首先在20世纪70年代初实现, int与处理器寄存器一样大:16位。 在较大的机器上,例如VAX ,它被扩展到32位以允许更大的arrays。

这项公约基本上已被放弃; C和C ++标准使用size_tssize_t来表示数组的索引和长度。 在64位平台上,通常int仍为32位宽,而size_t为64位。 (但是许多较旧的API,例如CBLAS ,仍然使用int作为索引。)

字节是目标系统可以处理和唯一寻址的最小内存单位。 因此,字节的大小是平台和编译器相关的,但在大多数设置中是8位。

因此,假设一个字节是8位,这意味着64位等于8个字节,32位等于4个字节,16位等于2个字节。

在模糊级别上,“X位系统”是默认情况下基本值(寄存器,整数等)为X位的系统。 因此,系统本身使用的位数会立即影响保存这些值所需的字节数。

您的问题可以重新表述为不同类型的数据结构取决于CPU的原因。 这可以简单地通过C是可以在低级编程中使用的语言这一事实​​来certificate。 您可以在内核中的数据类型中看到如何为Linux中的不同类型的CPU定义数据类型。 这是处理器字长的链接。