mlAnswer = ( ( ( degreesPLato->text().toInt() * 1000000 ) * 3800 ) / answer );
是有问题的代码
mlAnswer
输出-8223,而我的计算器输出228000
调试输出
12 * 1000000 * 3800 / 200000 = -8223
所有数据类型都是ints
请告诉我我做错了什么。
12 * 1000000 * 3800 = 456 亿。
这超出了 4 字节有符号整数的范围,int
通常是这样。尝试long long
改用。
整数文字的默认类型是int
,除非数字太大而无法放入int
. 只要您在整数之间进行数学运算,结果就会保持为整数。 12
是一个int
,1000000
是一个int
,并且3800
是一个int
。当您将它们相乘时,结果仍然是int
,即使它不再适合。添加LL
后缀以使整数文字成为 long long。即12LL
, 1000000LL
,3800LL
等...
您可以通过重新排序操作来解决此问题:
12 * 1000000 * 3800 / 200000
但是会溢出一个int
:
12 * 1000000 / 200000 * 3800
将不会。
请注意,如果分子是分母的整数倍,这只会给出相同的答案。在支持它的平台上使用LL
是更好的解决方案,但是如果您被限制为 4 字节int
类型,这至少会在更多情况下停止溢出。