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

时间:2013-01-10 11:17:42

标签: c++ c operating-system

我觉得为什么int的大小取决于哪个OS正在使用,在C& C ++。如果指针的大小变化,但为什么整数的大小。如果16位OS sizeof(int)= 2字节,则32位sizeof(int)= 4字节。为什么这样?

感谢。

4 个答案:

答案 0 :(得分:4)

  

为什么会这样?

历史原因。

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

根据C ++标准

1.7.1陈述:

  

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

然后3.9.1.1陈述:

  

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

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

  

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

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

答案 3 :(得分:1)

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