可能重复:
size of int, long, etc
Does the size of an int depend on the compiler and/or processor?
我不确定之前是否曾经问过类似的问题(至少,我在搜索时找不到任何问题,所以想到问自己)。
决定int
中C
(和其他数据类型)的大小的因素。我已经阅读了它取决于机器/操作系统/编译器,但没有得到明确/详细的解释,比如什么覆盖了另一个等等。任何解释或指针都会非常有用。
答案 0 :(得分:14)
最终编译器会这样做,但为了使编译的代码能够很好地与系统库一起使用,大多数编译器都会匹配用于构建目标系统的编译器的行为。
如此松散地说,int
的大小是目标硬件和操作系统的属性(同一硬件上的两个不同操作系统可能具有不同大小的int
,并且运行相同的操作系统两个不同的机器可能具有不同的int
大小;两者都有相当普遍的例子。
所有这些也受到C标准规则的约束。例如,int
必须足够大才能代表-32767
和32767
之间的所有值。
答案 1 :(得分:3)
int
是平台的“自然”大小,实际上意味着
处理器的寄存器大小,或
与现有代码库向后兼容的大小(例如Win64中的32位int
)。
编译器供应商可以自由选择≥16个值位的任何大小,但(对于桌面平台及更高版本),不能与OS'API一起使用的大小将意味着很少有任何编译器副本被出售。 ; - )
答案 2 :(得分:0)
注(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
- 运算符告诉您对象的大小(以字节为单位)CHAR_BITS
告诉您每字节的位数因此,sizeof(foo) * CHAR_BITS
会告诉您类型foo
的大小,以位为单位,包括填充。
其他任何事情都只是假设。请注意,主机环境可能包含10,000个带有袖珍计算器的中国人和一个巨大的黑板,可以凭空捏造尺寸限制。