GCC の使用:
printf("%i \n", -1 % (int)4);
printf("%u \n", -1 % (unsigned int)4);
出力:
-1
3
プラットフォーム間でこの動作に依存できますか? MOD
これが変更されていないことを確認するには、REM
マクロを明示的に定義する必要が ありますか?
GCC の使用:
printf("%i \n", -1 % (int)4);
printf("%u \n", -1 % (unsigned int)4);
出力:
-1
3
プラットフォーム間でこの動作に依存できますか? MOD
これが変更されていないことを確認するには、REM
マクロを明示的に定義する必要が ありますか?
C99 標準は次のように述べています。
6.5.5 乗法演算子
:
整数を除算すると、/演算子の結果は小数部を切り捨てた代数商になります87)。商a/bが表現可能な場合、式
(a/b)*b + a%bは a と等しくなります。
:
87) これはしばしば「ゼロへの切り捨て」と呼ばれます。</p>
これは、除算が常に 0 に向かって丸められることを意味するため、信頼できます。
これは C++03 標準とは異なることに注意してください。
2 行目は符号なし除算を行い、値-1
をunsigned int
除算前に変換します。これは常に 2 の累乗よりも 1 少ないため、これも明確に定義されています。
モジュロ演算子 ( %
) は、何年もの間、C および C++ 標準の一部でした。C++ でオーバーロードできるかどうかはわかりません。はい、あなたはそれに頼ることができます。