为什么下面的代码给出整数溢出警告:长整数溢出
#include <stdio.h>
int main()
{
long long int x = 100000 * 99999;
return 0;
}
而下面的代码工作完美:
#include <stdio.h>
int main()
{
long long int x = 100000000000000;
return 0;
}
为什么下面的代码给出整数溢出警告:长整数溢出
#include <stdio.h>
int main()
{
long long int x = 100000 * 99999;
return 0;
}
而下面的代码工作完美:
#include <stdio.h>
int main()
{
long long int x = 100000000000000;
return 0;
}
因为这里
long long int x = 100000 * 99999;
2个整数倍增。请尝试
long long int x = 100000LL * 99999;
谢谢。我只是尝试1LL * 100000 * 99999,它的工作。但100000 * 99999 * 1LL没有工作。现在我明白了你的观点。谢谢。 – user3243499
@ user3243499事实上,因为'100000 * 99999 * 1LL'被评估为'(100000 * 99999)* 1LL',并且括号中的表达式是两个“int”的乘积。 – AlexD
到目前为止,我的误解是在C/C++中,最终的大小将始终等于表达式中的最大大小。 – user3243499
使其成为100000LL * 99999LL
,以使警告消失。
的类型整数文字的是其中值 可以适合,从依赖于哪个数字基 和其中使用整数后缀的类型列表中的第一类型。
(感谢@UnHolySheep谁让我注意到它)。 如果您希望编译器解释不同的文字,您必须添加后缀。例如,对于int
,可以添加LL
或ll
以指定它是long long int
。使用无符号数字后缀为u
。
浮点文字,这是相同的:有一个默认的类型,这是double
,但如果你想有一个float
您可以方便地使用f
(或f
)后缀。有了浮点数,你甚至可以使用指数表示式(使用e
)。
*“默认情况下,整数文字(常量)的类型为int”* - 不,您是否自己阅读了第二个链接?整数常量或可以容纳它们的第一个类型,它恰好在OP的情况下是'int'。如果数量足够大,无法保存在'int'中,则选择下一个更大的类型(如果该数字不能保存,则可以选择下一个更大的类型,等等) – UnholySheep
您是对的,我的不好。现在我改变它。 –
您正在乘以“int”值(不是两个“long long”值) – gawi
来自[整数字面值引用](http://en.cppreference.com/w/cpp/language/integer_literal):* “整数文字的类型是值可以适合的第一个类型”* - 因此在这种情况下'int' – UnholySheep
但是在任何一种情况下,我只是分配数字。在两种情况下,结果都应该是相同的,因为第一种情况下的乘法结果少于第二种情况下的乘法结果。 – user3243499