0

mlAnswer = ( ( ( degreesPLato->text().toInt() * 1000000 ) * 3800 ) / answer );

是有问题的代码 mlAnswer输出-8223,而我的计算器输出228000

调试输出

12 * 1000000 * 3800 / 200000 = -8223

所有数据类型都是ints请告诉我我做错了什么。

4

2 回答 2

5

12 * 1000000 * 3800 = 456 亿。

这超出了 4 字节有符号整数的范围,int通常是这样。尝试long long改用。

整数文字的默认类型是int,除非数字太大而无法放入int. 只要您在整数之间进行数学运算,结果就会保持为整数。 12是一个int1000000是一个int,并且3800是一个int。当您将它们相乘时,结果仍然是int,即使它不再适合。添加LL后缀以使整数文字成为 long long。即12LL, 1000000LL,3800LL等...

于 2013-06-20T05:15:23.120 回答
1

您可以通过重新排序操作来解决此问题:

12 * 1000000 * 3800 / 200000

但是会溢出一个int

12 * 1000000 / 200000 * 3800

将不会。

请注意,如果分子是分母的整数倍,这只会给出相同的答案。在支持它的平台上使用LL是更好的解决方案,但是如果您被限制为 4 字节int类型,这至少会在更多情况下停止溢出。

于 2013-06-20T05:27:06.330 回答