我得到了-496307337的答案。代码有什么问题?
B ba
C ca
and so on...
有人可以在这里解释转换过程吗?
编辑:
我发现需要在#include <iostream>
using namespace std;
int main() {
// your code goes here
int displacement_sum_x = -4500;
unsigned long cluster_size = 900;
//... with some calculation the value of displacement_sum_x is -4500.
displacement_sum_x /= cluster_size;
std::cout << displacement_sum_x;
}
进行类型转换,然后代码才有效。
有没有办法,我可以使用某种c ++警告/错误,以便我在编译时遇到问题?使用常规设置的gcc编译器并没有抱怨这一点。
答案 0 :(得分:2)
首先,你应该避免在同一个表达式中混合有符号和无符号值(当涉及负数时,尤其是)。在您的情况下,操作:
displacement_sum_x /= cluster_size;
相当于:
displacement_sum_x = displacement_sum_x / cluster_size;
在上面的表达式中,由于运算符/
的操作数不同(int
/ unsigned long
),因此int
为promoted static_cast
1}},这是一个非常大的值。然后将该结果除以5,并将其下载回整数(一个好的编译器应该警告您有符号/无符号的不匹配)。要解决此问题,只需更改此类表达式,以便将unsigned long
初始化为整数,或使用example将其强制转换为整数(我建议使用前一个)。
这是一个recursion-scheme来说明这一点。
答案 1 :(得分:-1)
问题在您的代码中存在
displacement_sum_x / = cluster_size;
点 1)你正在划分像(unsigned long)/(int)
2)由于除法需要相同的数据类型,因此int被提升为无符号长
3)将值(int displacement_sum_x = -4500)转换为无符号长整数,它将等于4294962796
4)然后分裂发生在4294962796/900 = 4772180.88444
5)结果将是4772180,因为它不是浮动类型。
答案 2 :(得分:-1)
您需要转换值才能执行操作:
displacement_sum_x /= (int) cluster_size;
gcc选项-Wconversion
和-Wsign-conversion
应有助于查看问题。
您可以获得有关警告选项here
的更多信息