【问题标题】:Calculating modulus in a function gives different answer from using % operator directly [duplicate]计算函数中的模数与直接使用 % 运算符给出不同的答案[重复]
【发布时间】:2013-08-30 11:37:39
【问题描述】:

my_mod.cpp:

#include <iostream>
using namespace std;

unsigned int my_mod(int a, unsigned int b)
{
    int result;

    cout << "\ta\t=\t" << a << endl;
    cout << "\tb\t=\t" << b << endl;
    cout << "\ta%b\t=\t" << a%b << endl;

    result = a%b;
    if (result < 0) {result += b;}
    return result;
}

int main()
{
    cout << "-1%5 = " << -1%5 << endl;
    cout << "my_mod(-1,5) = " << my_mod(-1,5) << endl;
    return 0;
}

通过以下方式编译: g++ ./my_mod.cpp

结果:

-1%5 = -1
    a   =   -1
    b   =   5
    a%b =   0
my_mod(-1,5) = 0

这里到底发生了什么,我就是不明白会发生什么?!这不可能是由于全球范围,对吧?! 我的意思是它是完全相同的 %-expression ......他们怎么能产生 0 和 -1?! (顺便说一下,而不是所需的 4。)

如果有人可以,请向我解释一下……我花了几天时间才将更广泛的错误范围缩小到这个范围。说真的,我快哭了。

如何让我的(全局)自己的模数在上面的示例中返回 4??

【问题讨论】:

  • 你为什么会期望 4 作为结果?
  • 这应该是实现周期性边界条件,所以得到4就可以了。

标签: c++ c++11


【解决方案1】:

这是因为您使用的是无符号整数,有符号整数 (-1) 被提升为 -1 % UINT_MAX 所以您的操作变为 (-1 % UINT_MAX) % 5 = 0(感谢 jrok 提供了更详细的原因)

试试

cout << "\ta%b\t=\t" << a%(int)b << endl;

result = a%(int)b;

函数签名为:int my_mod(int a, unsigned int b)

或者只使用函数签名:int my_mod(int a, int b)

【讨论】:

  • 其实是因为整数提升,有点迂腐。 -1 提升为 unsigned int 产生可被 5 整除的 UINT_MAX。
  • 好的,现在速度快到让我尴尬了。对不起,我不知道我怎么会看不到这个。自从这个错误把事情搞砸了,我没有睡多少觉,当然。但这很糟糕。非常非常感谢!
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多