长长于C / C ++(long long in C/C++)

2019-07-18 23:30发布

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

当我取消了注释行,代码不编译,并给了一个错误:

错误:整型常量是长型过大

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

为什么?

Answer 1:

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

long long num3 = 100000000000LL;

后缀LL使文字变成类型long long 。 C是不是足够“智能”,从左边的类型推断此,类型是字面本身的属性,而不是正在使用它的上下文。



Answer 2:

尝试:

num3 = 100000000000LL;

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



Answer 3:

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

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



Answer 4:

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

num3 = 100000000000000000000;

开始得到警告。



文章来源: long long in C/C++