我想在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;
开始得到警告。