我觉得为什么int的大小取决于哪个OS正在使用,在C& C ++。如果指针的大小变化,但为什么整数的大小。如果16位OS sizeof(int)= 2字节,则32位sizeof(int)= 4字节。为什么这样?
感谢。
答案 0 :(得分:4)
为什么会这样?
历史原因。
在1989年ANSI C标准和size_t
出现之前,int
是用于索引数组的类型。 malloc
以int
作为参数,strlen
返回了一个。因此int
必须足够大以索引任何数组,但小到足以不会导致过多的开销。对于文件偏移量,通常较大的类型(例如long
为typedef
'到off_t
。
在PDP-11上,C在20世纪70年代初首次实现,int
与处理器寄存器一样大:16位。在较大的机器上,例如VAX,它被扩展到32位以允许更大的数组。
这项公约基本上已被放弃; C和C ++标准使用size_t
和ssize_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定义数据类型。这是处理器字长的链接。