5

私は定義について尋ねているのではなく、言語の作成者が C++ で非対称動作を使用してモジュラスを定義することを選択した理由を尋ねているのです。(ジャバもそうだと思います)

f で割り切れる n 以上の最小の数を見つけたいとします。

n が正の場合、次のようにします。

if(n % f)
   ans = n + f - n % f;

n が負の場合:

ans = n - n % f;

明らかに、この定義は、負の数と正の数を扱う場合に最も適切ではありません。では、なぜこのように定義されたのでしょうか。どのような場合に便宜を図りますか?

4

2 に答える 2

1

あなたは間違っています。が負の場合、C++ では、およびからの結果が一貫してnいる限り、モジュラス演算子の結果が負または正のいずれかになることが許可されます。C99 では、will の結果が と同じ符号を持つ必要があります。他の一部の言語 (Python など) では、 の符号がと同じ符号である必要があります。%/ab(a/b)*b + a%baa % baa % bb

これは、ネガティブに指定した式がn実際に C++ で動作する必要がないことを意味します。/ifn%fが正の数 (n負であっても) になる場合、それはans未満になりnます。

于 2011-09-17T05:30:50.543 に答える
1

「モジュロ 2 演算」を使用しているため、各 2 進数は互いに独立して処理されます。ここで「除算」の例を見てください

于 2011-09-17T01:04:46.903 に答える