C++ qt返回糟糕的数学结果
C++ qt返回糟糕的数学结果,c++,algorithm,qt,C++,Algorithm,Qt,mlAnswer=((degreesPLato->text().toInt()*1000000)*3800)/answer 代码在查询中吗 mlAnswer输出-8223,而我的计算器输出228000 调试输出 12*1000000*3800/200000=-8223 所有数据类型都是ints请告诉我我做错了什么。12*1000000*3800=456亿 这超出了4字节有符号整数的范围,这是int通常的值。尝试改用long 整数文本的默认类型是int,除非该数字太大而无法放入int中。只要在整数
mlAnswer=((degreesPLato->text().toInt()*1000000)*3800)/answer代码>
代码在查询中吗
mlAnswer
输出-8223,而我的计算器输出228000
调试输出
12*1000000*3800/200000=-8223
所有数据类型都是ints
请告诉我我做错了什么。12*1000000*3800=456亿
这超出了4字节有符号整数的范围,这是int
通常的值。尝试改用long
整数文本的默认类型是int
,除非该数字太大而无法放入int
中。只要在整数之间进行数学运算,结果将保持为整数12
是int
,1000000
是int
,3800
是int
。当将它们相乘时,结果仍然是int
,即使它不再适合。添加LL
后缀,使整型文字变长。i、 e.12LL
,10000000000ll
,3800LL
,等等。12*1000000*3800=456亿
这超出了4字节有符号整数的范围,这是int
通常的值。尝试改用long
整数文本的默认类型是int
,除非该数字太大而无法放入int
中。只要在整数之间进行数学运算,结果将保持为整数12
是int
,1000000
是int
,3800
是int
。当将它们相乘时,结果仍然是int
,即使它不再适合。添加LL
后缀,使整型文字变长。i、 e.12LL
,10000000000ll
,3800LL
,等等。您可以通过重新安排操作顺序来解决此问题:
12 * 1000000 * 3800 / 200000
将溢出int
,但是:
12 * 1000000 / 200000 * 3800
不会
请注意,只有当分子是分母的整数倍时,才会给出相同的答案。在支持它的平台上使用LL
是一个更好的解决方案,但如果您被限制为4字节int
类型,这至少可以在更多情况下阻止溢出。您可以通过重新排序操作来解决此问题:
12 * 1000000 * 3800 / 200000
将溢出int
,但是:
12 * 1000000 / 200000 * 3800
不会
请注意,只有当分子是分母的整数倍时,才会给出相同的答案。在支持它的平台上使用LL
是一个更好的解决方案,但是如果您被限制为4字节int
类型,这至少可以在更多情况下阻止溢出。听说过整数溢出吗?是的,我尝试了long-long-int,得到了相同的结果让我猜一下。。。通过改变变量mlAnswer?到那时已经太晚了。这个等式永远不会根据它所使用的数据类型进行计算。它是从它最终得到的任何类型转换为该类型的,只有在等式已经被计算之后,才在赋值时进行转换。尝试将“LL”放在1000000之后。是的,将LL添加到100000的末尾可以解决此问题。非常感谢。你能详细解释一下原因吗?听说过整数溢出吗?是的,我尝试了long-long-int,得到了相同的结果。让我猜猜。。。通过改变变量mlAnswer?到那时已经太晚了。这个等式永远不会根据它所使用的数据类型进行计算。它是从它最终得到的任何类型转换为该类型的,只有在等式已经被计算之后,才在赋值时进行转换。尝试将“LL”放在1000000之后。是的,将LL添加到100000的末尾可以解决此问题。非常感谢。你能详细解释一下原因吗。@Cjueden:我们需要看一个完整的代码示例来说明问题。是的,达伦刚才说的,添加L
,即12L
应该足够了。@JesseGood:12LL
很长时间了,不是吗?是的,我忘了在windows上,long
仍然是32位。另外,您应该检查输入的数字是否在有效范围内。也许它能与3800一起工作,但在某个时候它会溢出again@Cjueden:我们需要看一个完整的代码示例来说明问题。是的,darron刚才说的,添加L
,即12L
应该足够了。@JesseGood:12LL
很长时间了,不是吗?是的,我忘了在windows上,long
仍然是32位。另外,您应该检查输入的数字是否在有效范围内。也许3800可以使用,但在某个时候它会再次溢出