什么决定了C中整数的大小?

时间:2012-12-07 14:19:31

标签: c++ c sizeof

  

可能重复:
  size of int, long, etc
  Does the size of an int depend on the compiler and/or processor?

我不确定之前是否曾经问过类似的问题(至少,我在搜索时找不到任何问题,所以想到问自己)。

决定intC(和其他数据类型)的大小的因素。我已经阅读了它取决于机器/操作系统/编译器,但没有得到明确/详细的解释,比如什么覆盖了另一个等等。任何解释或指针都会非常有用。

4 个答案:

答案 0 :(得分:14)

最终编译器会这样做,但为了使编译的代码能够很好地与系统库一起使用,大多数编译器都会匹配用于构建目标系统的编译器的行为。

如此松散地说,int的大小是目标硬件和操作系统的属性(同一硬件上的两个不同操作系统可能具有不同大小的int,并且运行相同的操作系统两个不同的机器可能具有不同的int大小;两者都有相当普遍的例子。

所有这些也受到C标准规则的约束。例如,int必须足够大才能代表-3276732767之间的所有值。

答案 1 :(得分:3)

int是平台的“自然”大小,实际上意味着

之一
  • 处理器的寄存器大小,或

  • 与现有代码库向后兼容的大小(例如Win64中的32位int)。

编译器供应商可以自由选择≥16个值位的任何大小,但(对于桌面平台及更高版本),不能与OS'API一起使用的大小将意味着很少有任何编译器副本被出售。 ; - )

答案 2 :(得分:0)

除了维基百科之外,我几乎都不知道,几乎...... 见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位。

答案 3 :(得分:0)

C数据类型的大小受C标准的约束,通常是对最小大小的约束。主机环境(目标机器+ OS)可能会施加进一步的限制,即对最大大小的约束。最后,编译器可以自由选择这些最小值和最大值之间的合适值。

通常,对C数据类型的大小进行假设被认为是不好的做法。此外,没有必要,因为C会告诉你:

  • sizeof - 运算符告诉您对象的大小(以字节为单位)
  • 来自limits.h的宏CHAR_BITS告诉您每字节的位数

因此,sizeof(foo) * CHAR_BITS会告诉您类型foo的大小,以位为单位,包括填充。

其他任何事情都只是假设。请注意,主机环境可能包含10,000个带有袖珍计算器的中国人和一个巨大的黑板,可以凭空捏造尺寸限制。