为什么sizeof(int)== sizeof(long)?
在下面列出的程序中,sizeof(int)和sizeof(long)在我的机器上是相等的(都等于4个字节(或32位))。 据我所知,很长一段是8个字节。 它是否正确? 我有一台64位机器
#include #include int main(void){ printf("sizeof(short) = %d\n", (int)sizeof(short)); printf("sizeof(int) = %d\n", (int)sizeof(int)); printf("sizeof(long) = %d\n", (int)sizeof(long)); printf("sizeof(float) = %d\n", (int)sizeof(float)); printf("sizeof(double) = %d\n", (int)sizeof(double)); printf("sizeof(long double) = %d\n", (int)sizeof(long double)); return 0; }
据我所知,很长一段是8个字节。 它是否正确?
不,这不对。 C和C ++规范仅声明long必须大于或等于32位。 int
可以更小,但在许多平台上,在C和C ++中, long
和int
都是32位。
这是一个非常好的理由选择固定宽度整数类型 ,如int64_t
如果它们可用,并且您正在使用C99或提供等效类型的框架。
C不是Java也不是C#。 正如其他人所写,C规范规定了最小长度和相对长度。 为什么? C被设计为低级别,几乎可以在任何硬件上编译和运行。
如果一个规范向程序员承诺太多,那么当硬件不支持这样的事情时,它的实现会变得棘手(而且很慢)。 Java和C#开发人员并不太在意,他们喜欢将语言的便利性用于更高级别的工作,并且不要犹豫,安装大型虚拟机来完成所有承诺(或至少大部分的承诺)。
C程序员希望即使在机器指令级别上也能控制代码。 完全控制硬件。 只有这样才能使用所有硬件function,并达到最高性能。 但是你必须小心你对你正在使用的硬件的假设。 一如既往,强大的力量带来了巨大的责任。
只是为了说明:C不假设8位字节。 请参阅CHAR_BIT
。
相关问题是C中整数的大小 。
这取决于你的ABI。 如果您使用的是Windows,那么Microsoft会选择LLP64模型,因此long
和int
都是32位,而long long
和指针在64位版本中是64位,这是出于传统原因。
大多数UNIX平台选择了一个LP64模型,它为64位构建提供了32位, long
, long long
, int
和64位指针。
但是,正如Reed Copsey所说,标准只规定了最小长度和相对长度。 long
必须大于或等于int
的长度。
不,标准定义了long
为4 bytes
且int
为2 bytes
的最小值。 根据C99标准草案第5.2.4.2.1
节整数类型的大小第1段说:
[……]其实施定义的数值应等于或大于[…]
我们有long
:
LONG_MIN -2147483647 // -(2^31 - 1) LONG_MAX +2147483647 // 2^31 - 1
这是4 bytes
。 为了完整起见,我们有以下int
:
INT_MIN -32767 // -(2^15 - 1) INT_MAX +32767 // 2^15 - 1
这是2 bytes
。