【问题标题】:Wrong modulus result when using unsigned int使用 unsigned int 时模数结果错误
【发布时间】:2018-07-30 17:38:43
【问题描述】:

我会考虑以下 sn-p :

int a =-9;
int m = 10;
unsigned int m1 =10;

std::cout<<a%m<<std::endl;
std::cout<<a%m1<<std::endl;

结果是:

-9
 7

7 太奇怪了。 谁能解释一下?

【问题讨论】:

标签: c++ modulus


【解决方案1】:

根据 C++ 2017 (draft n4659) 8 11,通常的算术转换是在 a % m 的操作数上执行的。根据 11.5.3,当一个操作数为有符号整数类型而另一个为大于或等于等级的无符号整数类型时,有符号操作数将转换为无符号操作数的类型。

这会导致 -9 的 int 值转换为 unsigned。此转换执行的模数比 unsigned 的最大值大一,在您的实现中显然是 4,294,967,295 (232-1),因此转换执行模数 4,294,967,296,产生 4,294,967,287。 (执行模 4,294,967,296 的转换意味着根据需要多次添加或减去 4,294,967,296 以产生 0 到 4,294,967,295(含)范围内的结果。)

那么%操作符就照常操作了; 4,294,967,287 除以 10 的余数是 7。

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多