我想在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;
}

当我去掉了注释行,代码不编译和被赋予的错误:

  

错误:整数常数过大,长型

但是,如果在编译代码,因为它是和被执行时,它产生比百亿大得多的值。

为什么?

有帮助吗?

解决方案

字母千亿补文字整数常数,但该值是该类型int太大。需要使用后缀来改变文字,即类型。

long long num3 = 100000000000LL;

后缀LL使得字面成型long long。 C不是“智能”足以从左侧的类型结束此,类型是文字本身的性质,而不是在其中使用它的上下文。

其他提示

尝试:

num3 = 100000000000LL;

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

这取决于你正在编译什么模式。长长是不是C ++的一部分的标准,但仅(通常)支持作为扩展。这会影响文字的类型。不带任何后缀十进制整数文字是int类型的的总如果int是足够大来表示数,否则长。如果数字是偶数太大长期结果是实现定义(即已经被截断的向后兼容性可能只是一个数量型长整型)。在这种情况下,必须显式使用LL后缀,以使长长延(在大多数编译器)。

在接下来的C ++版本将正式长长的支持,你将不再需要任何后缀的方式,除非你明确地想要的力字面的类型必须至少很长很长。如果该号码不能在长表示,编译器会自动尝试长长使用,即使没有LL后缀。相信这是C99的行为以及

你的代码编译在这里罚款(即使该行注释。不得不将其更改为

num3 = 100000000000000000000;

要开始获取警告。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top