4

我很清楚为什么 int 的大小取决于在 C 和 C++ 中使用的是哪个操作系统。如果指针的大小不同也没关系,但为什么整数的大小。如果 16 位 OS sizeof(int) = 2 字节,则对于 32 位 sizeof(int) = 4 字节。为什么这样?

谢谢。

4

4 回答 4

5

为什么这样?

历史原因。

在 ANSI C 标准和size_t1989 年出现之前,int是用于索引数组的类型。malloc以 anint作为参数,strlen返回一个。因此int必须大到足以索引任何数组,但又小到不会造成太多开销。对于文件偏移,通常是较大的类型,例如longwas typedef'd to off_t

PDP-11上,C 于 1970 年代初首次实现,与int处理器寄存器一样大:16 位。在VAX等大型机器上,它被扩大到 32 位以允许更大的阵列。

这个约定在很大程度上被放弃了;C 和 C++ 标准使用size_tandssize_t表示数组的索引和长度。在 64 位平台上,通常int仍然是 32 位宽,而size_t64 位。(不过,许多较旧的 API,例如CBLAS仍然int用于索引。)

于 2013-01-10T12:45:07.693 回答
2

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

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

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

于 2013-01-10T11:21:28.897 回答
2

根据 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是(a)保证至少是一个字节,并且(b)自然地与它运行的操作系统/硬件对齐,所以现在很可能是 64 位或(对于许多旧系统)32 位.

于 2013-01-10T11:41:32.987 回答
1

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

于 2013-01-10T13:09:11.827 回答