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++,最终大小将始终等于表达式中的最大大小。@Ron
const
在这里不应该有任何区别。@user3243499:事实上,为了记录在案,在计算每个二元运算符时,整数提升(将较小的操作数与较宽的操作数相匹配,或者将两者都提升为int,如果较窄的话),按照运算符优先级的顺序。“默认情况下,整型文字(常量)的类型为int”-否,您是否自己读取了第二个链接?整数常量或第一种可以容纳它们的类型,在OP的例子中正好是
int
。如果数字足够大,无法保存在
int
中,则选择下一个较大的类型(如果该类型也无法保存,则选择下一个较大的类型,等等),此答案可能需要解释为什么要这样做