87

我正在 GNU 的 C++ 编译器上尝试此代码,但无法理解其行为:

#include <stdio.h>;

int main()
{
    int  num1 = 1000000000;
    long num2 = 1000000000;
    long long num3;
    //num3 = 100000000000;
    long long num4 = ~0;

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
    printf("%d %ld %lld %llu", num1, num2, num3, num4);
    return 0;
}

当我取消注释注释行时,代码无法编译并给出错误:

错误:整数常量对于长类型来说太大了

但是,如果代码按原样编译并执行,它会产生远大于 10000000000 的值。

为什么?

4

5 回答 5

152

字母 100000000000 构成了一个字面整数常量,但是对于 type 来说该值太大了int。您需要使用后缀来更改文字的类型,即

long long num3 = 100000000000LL;

后缀LL使文字变为 type long long。C 不够“聪明”,无法从左侧的类型得出结论,类型是文字本身的属性,而不是使用它的上下文。

于 2009-09-22T09:02:55.850 回答
27

尝试:

num3 = 100000000000LL;

顺便说一句,在 C++ 中,这是一个编译器扩展,标准没有定义 long long,这是 C99 的一部分。

于 2009-09-22T09:03:25.283 回答
6

这取决于您正在编译的模式。long long 不是 C++ 标准的一部分,但仅(通常)支持作为扩展。这会影响文字的类型。如果 int 大到足以表示数字,则没有任何后缀的十进制整数文字始终是 int 类型,否则为 long。如果这个数字对于 long 来说太大,结果是实现定义的(可能只是为了向后兼容而截断的一些 long int 类型)。在这种情况下,您必须显式使用 LL 后缀来启用 long long 扩展(在大多数编译器上)。

下一个 C++ 版本将以一种不需要任何后缀的方式正式支持 long long,除非您明确希望强制文字的类型至少为 long long。如果数字不能用 long 表示,即使没有 LL 后缀,编译器也会自动尝试使用 long long。我相信这也是 C99 的行为。

于 2009-09-22T09:56:36.740 回答
2

您的代码在这里编译得很好(即使该行未注释。必须将其更改为

num3 = 100000000000000000000;

开始收到警告。

于 2009-09-22T09:05:25.360 回答
1

笔记:

  1. 去掉头文件后的分号
  2. 使用 %lu 而不是 %u
  3. 长长 num3 = 100000000000LL;

更换这些东西,你很高兴:)

于 2021-07-01T14:20:59.883 回答