Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ qt返回糟糕的数学结果_C++_Algorithm_Qt - Fatal编程技术网

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可以使用,但在某个时候它会再次溢出