在 C90 中,无后缀十进制整数常量(字面量)的类型是第一个
int
long int
unsigned long int
可以表示其值而不会溢出。
在 C99 及更高版本中,它是第一个
int
long int
long long int
可以代表它的价值。
该值4014109449
恰好可以表示为 32 位无符号整数,但不能表示为 32 位有符号整数。假设您的系统具有 32 位long
s,则该常量的类型unsigned long int
在 C90、long long int
C99 和 C11 中。
这就是警告告诉你的。常量的类型会根据您的编译器所遵循的 C 标准版本而有所不同。
请注意,无论其类型如何,值4014109449
始终是正确的,并且在您的声明中:
long long int num = 1000000000000;
该值将始终正确转换为long long
. LL
但是添加一个后缀以明确表示您想要一个 type 的值肯定不会有什么坏处(并且会使警告静音)long long
:
long long int num = 1000000000000LL;
至于这个:
long long int num = 1000000*1000000;
假设你有 32 位int
s,常量1000000
是 type int
,两个int
值相乘的结果也是 type int
。在这种情况下,乘法将溢出。同样,您可以通过确保常量为 type 来避免该问题long long int
:
long long int num = 1000000LL * 1000000LL;
(请注意,您可以使用小写字母ll
,但这是个坏主意,因为很难区分字母l
和数字1
。)