用unsigned long除整数 - 是否存在编译时错误/警告?

时间:2018-02-03 17:24:08

标签: c++ math

我得到了-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编译器并没有抱怨这一点。

3 个答案:

答案 0 :(得分:2)

首先,你应该避免在同一个表达式中混合有符号和无符号值(当涉及负数时,尤其是)。在您的情况下,操作:

displacement_sum_x /= cluster_size;

相当于:

displacement_sum_x = displacement_sum_x / cluster_size;

在上面的表达式中,由于运算符/的操作数不同(int / unsigned long),因此intpromoted 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

的更多信息