最終更新日時:
が更新

履歴 編集

整数に対する除算と剰余算の丸め結果を規定(C++11)

概要

整数a, bに対する除算a/bの結果(商)と剰余算a%bの結果(余り)について(a/b)*b + a%b = aという等式が成り立つことが規定されているが、C++03まで、少なくとも一方が負の数である場合の余りの符号は実装定義だった。このため先述の等式により商も実装定義となっていた。C++11ではC99に合わせて「商の小数部がゼロ方向に切り捨てられた結果となること」が規定された。

これにより、整数に対する除算と剰余算の結果が移植性のある値となるようになった。

仕様

C++03では、余りの符号が以下のように規定されていた:

「両方の項が非負である場合、余りは非負となる。片方もしくは両方の項が負数である場合、余りの符号は実装定義となる。注釈:現在作業中のISO Cのリビジョン(C99のこと)とISO/IEC 1539:1991で標準化されているFortranの規格ではいずれも、整数に対する除算の商は必ずゼロ方向に丸められる。」

C++11では、C99との互換性のために、上記規定を置き換えて、整数に対する除算の結果が以下のように規定された:

「整数型を項とする/演算子の結果は代数的な商から小数部を切り捨てたものとなる。注釈:これは「ゼロ方向への切り捨て(truncation towards zero)」とも呼ばれる。」

#include <cassert>

int main()
{
  assert(-7 / +2 == -3 && -7 % +2 == -1); // C++03 までは商 -4 余り +1 となる実装も規格適合
  assert(+7 / -2 == -3 && +7 % -2 == +1); // C++03 までは商 -4 余り -1 となる実装も規格適合
  assert(-7 / -2 == +3 && -7 % -2 == -1); // C++03 までは商 +4 余り +1 となる実装も規格適合
}

出力

参照