题
我想在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;
要开始获取警告。
不隶属于 StackOverflow