长期在C / C ++

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

当我取消评论行的注释时,代码不会编译并提供错误:

错误:对于长types,整数常量太大

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

为什么?

字母100000000000组成一个文字整数常量,但是对于inttypes来说这个值太大了。 你需要使用后缀来改变文字的types,即

 long long num3 = 100000000000LL; 

后缀LL使文字变long longtypes。 C不足以从左边的types得出结论,types是文本本身的属性,而不是它被使用的上下文。

尝试:

 num3 = 100000000000LL; 

而顺便说一下,在C ++中这是一个编译器扩展,标准没有定义很长的时间,这是C99的一部分。

这取决于你正在编译的模式。 long long不是C ++标准的一部分,只是(通常)支持扩展。 这会影响文字的types。 如果int大到足以表示数字,则不带任何后缀的十进制整数文字总是inttypes,否则为long。 如果这个数字太长,那么结果是实现定义的(可能只是为了向后兼容而被截断的long inttypes的数目)。 在这种情况下,您必须明确地使用LL后缀来启用较长的扩展(在大多数编译器上)。

下一个C ++版本将正式支持很长一段时间,除非你明确地要求文字的types至less很长,否则不需要任何后缀。 如果编号不能被表示很长时间,编译器会自动尝试使用很长时间,即使没有LL后缀。 我相信这也是C99的行为。

你的代码在这里编译好了(即使没有注释的那行)也不得不改变它

 num3 = 100000000000000000000; 

开始接受警告。