15

在下面列出的程序中,sizeof(int) 和 sizeof(long) 在我的机器上是相等的(都等于 4 字节(或 32 位))。据我所知,long 是 8 个字节。这个对吗?我有一台 64 位机器

#include <stdio.h>
#include <limits.h>

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;
}
4

4 回答 4

32

据我所知,long 是 8 个字节。这个对吗?

不,这是不正确的。C 和 C++ 规范仅规定 long 必须大于或等于 32 位。 int可以更小,但在许多平台上,在 C 和 C++ 中,long都是int32 位的。

这是首选固定宽度整数类型的一个很好的理由,例如int64_t它们是否可供您使用并且您正在使用 C99 或为您提供等效类型的框架。

于 2013-09-19T17:18:34.427 回答
6

这取决于您的 ABI。如果您使用的是 Windows,Microsoft 选择了 LLP64 模型,因此longint都是 32 位,而long long和 指针在 64 位版本中是 64 位,出于遗留原因。

大多数 UNIX 平台选择 LP64 模型,它使int32 位long、、、long long和指针为 64 位,用于 64 位构建。

但是,正如 Reed Copsey 所指出的,该标准仅规定了最小长度和相对长度。并且long必须大于或等于 的长度int

于 2013-09-19T17:22:41.943 回答
5

C 不是 Java 也不是 C#。正如其他人所写,C 规范规定了最小长度和相对长度。为什么?C 被设计为低级的,几乎可以在任何硬件上编译和运行。

如果一个规范对程序员的承诺太多,那么当硬件不支持这样的事情时,它的实现就会变得棘手(而且速度很慢)。Java 和 C# 开发人员并不太在意,他们喜欢他们的语言对高级工作的便利性,并且会毫不犹豫地安装大型虚拟机来实现所有承诺(或至少大部分承诺)。

C 程序员希望即使在机器指令级别也能控制代码。完全控制硬件。只有这样才能使用所有硬件功能,并达到最高性能。但是您必须小心您对所使用硬件的假设。一如既往,权力越大,责任越大。

只是为了说明这一点:C 不假设 8 位字节。见CHAR_BIT<limits.h>

一个相关的问题是Size of an integer in C

于 2013-09-19T17:44:47.197 回答
4

不,标准定义了longis4 bytesintis的最小值2 bytes。根据C99 草案标准部分5.2.4.2.1 Sizes of integer types1段说:

[...]它们的实现定义值的大小应相等或更大[...]

因为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

于 2013-09-19T17:22:06.207 回答