C++ C+中的长整数溢出+;
为什么下面的代码给出整数溢出警告:C++ C+中的长整数溢出+;,c++,C++,为什么下面的代码给出整数溢出警告: #include <stdio.h> int main() { long long int x = 100000 * 99999; return 0; } #包括 int main() { 长整型x=100000*99999; 返回0; } 而下面的代码工作得非常完美: #include <stdio.h> int main() { long long int x = 100000000000000;
#include <stdio.h>
int main()
{
long long int x = 100000 * 99999;
return 0;
}
#包括
int main()
{
长整型x=100000*99999;
返回0;
}
而下面的代码工作得非常完美:
#include <stdio.h>
int main()
{
long long int x = 100000000000000;
return 0;
}
#包括
int main()
{
长整型x=1000000000000;
返回0;
}
因为这里
long long int x = 100000 * 99999;
两个整数相乘。试一试
long long int x = 100000LL * 99999;
将警告设置为100000LL*9999ll
。您应该阅读或
整型文字的类型是值的第一个类型
可以从类型列表中进行拟合,该列表取决于哪个数字基
以及使用了哪个整数后缀
(感谢@UnHolySheep让我注意到了这一点)。
如果希望编译器以不同的方式解释文本,则必须添加后缀。例如,使用int
,您可以添加LL
或LL
,以指定它是长int
。对于无符号数字,后缀为u
对于浮点文本,它是相同的:有一个默认类型,即double
,但是如果您想要float
,可以很容易地使用f
(或f
)后缀。使用浮点,您甚至可以使用指数表示法(使用e
) 您将从“整型文字的类型是值可以容纳的第一种类型”乘以int
值(而不是两个long
值),因此在本例中,int
但是在任何一种情况下,我只是分配数字。这两种情况下的结果应该是相同的,因为第一种情况下的乘法结果比第二种情况下的要少。谢谢。我刚试过1LL*100000*99999,效果不错。但100000*99999*1LL不起作用。现在我明白你的意思了。谢谢。@user3243499确实如此,因为100000*99999*1LL
被计算为(100000*99999)*1LL
,括号中的表达式是两个int
s的乘积。到目前为止,我的误解是在C/C++,最终大小将始终等于表达式中的最大大小。@Ronconst
在这里不应该有任何区别。@user3243499:事实上,为了记录在案,在计算每个二元运算符时,整数提升(将较小的操作数与较宽的操作数相匹配,或者将两者都提升为int,如果较窄的话),按照运算符优先级的顺序。“默认情况下,整型文字(常量)的类型为int”-否,您是否自己读取了第二个链接?整数常量或第一种可以容纳它们的类型,在OP的例子中正好是int
。如果数字足够大,无法保存在int
中,则选择下一个较大的类型(如果该类型也无法保存,则选择下一个较大的类型,等等),此答案可能需要解释为什么要这样做