0

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

ここで実際に何が起こっているのか、何が起こっているのか理解できません?! これはグローバル スコープによるものではありませんよね?! つまり、それはまったく同じ % 式です ... どうすれば 0 と -1 が得られるのでしょうか?! (ちなみに、望ましい4の代わりに。)

誰かが私にこれを説明できるなら、お願いします...より広い文脈でエラーをこれに絞り込むのに数日かかりました。ホント、泣きそうです。

上記の例で、(グローバル) 独自のモジュラスが 4 を返すようにするにはどうすればよいですか??

4

1 に答える 1

3

unsigned int を使用しているため、signed int (-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)

于 2013-08-30T11:40:30.083 に答える