我不确定之前是否在 SO 上问过类似的问题(至少,我在搜索时找不到任何问题,所以想问自己)。
是什么决定 . 中int
(和其他数据类型)的大小C
。我已经读过它取决于机器/操作系统/编译器,但还没有对诸如什么覆盖另一个等事情进行清晰/详细的解释。任何解释或指针都会非常有帮助。
我不确定之前是否在 SO 上问过类似的问题(至少,我在搜索时找不到任何问题,所以想问自己)。
是什么决定 . 中int
(和其他数据类型)的大小C
。我已经读过它取决于机器/操作系统/编译器,但还没有对诸如什么覆盖另一个等事情进行清晰/详细的解释。任何解释或指针都会非常有帮助。
最终编译器会这样做,但为了使编译后的代码能够很好地与系统库配合使用,大多数编译器都会匹配用于构建目标系统的编译器的行为。
所以松散地说,大小int
是目标硬件和操作系统的一个属性(同一硬件上的两个不同操作系统可能有不同的大小int
,而在两台不同机器上运行的同一个操作系统可能有不同的大小int
;有合理的两者的常见例子)。
所有这些也受到 C 标准中的规则的约束。 int
例如,必须足够大以表示-32767
和之间32767
的所有值。
int
是平台的“自然”大小,在实践中,这意味着
处理器的寄存器大小,或
与现有代码库向后兼容的大小(例如 Win64 中的 32 位int
)。
编译器供应商可以自由选择具有 ≥ 16 位值的任何大小,除了(对于桌面平台和更高版本)不适用于 OS 的 API 的大小将意味着即使有编译器的任何副本也很少出售。;-)
所以除了维基百科之外什么都不知道,几乎……
见Integer_(computer_science)
注 (b) 说:
“ C/C++ 中 short、int 和 long 的大小取决于语言的实现;取决于数据模型,即使是 short 也可以是 16 位到 64 位之间的任何值。对于某些常见平台:
在较早的 16 位操作系统上,int 是 16 位,long 是 32 位。
在 32 位 Linux、DOS 和 Windows 上,int 和 long 是 32 位,而 long long 是 64 位. 对于运行 32 位程序的 64 位处理器也是如此。
在 64 位 Linux 上,int 是 32 位,而 long 和 long long 是 64 位。
C 数据类型的大小受 C 标准的限制,通常是最小大小的限制。主机环境(目标机器+操作系统)可能会施加进一步的限制,即对最大大小的限制。最后,编译器可以在这些最小值和最大值之间自由选择合适的值。
通常,对 C 数据类型的大小进行假设被认为是不好的做法。此外,这不是必需的,因为 C 会告诉你:
sizeof
-operator 以字节为单位告诉您对象的大小CHAR_BITS
告诉您每个字节的位数因此,sizeof(foo) * CHAR_BITS
告诉您 type 的大小(foo
以位为单位),包括填充。
其他任何事情都只是假设。请注意,主机环境也可能由 10.000 名中国人组成,他们拥有袖珍计算器和一块巨大的黑板,无中生有地消除了规模限制。