このメモはC++で整数a
とb
に対して a / b
や a % b
を実行する際、a
かb
が負の数だったときどうなるのかを調べてみた結果です。
ネット上のドキュメントを見ると、
Arithmetic operators - http://en.cppreference.com/w/cpp/language/operator_arithmetic
に書いてありました。その内容から引用すると、
- 割り算は実装依存の方向に丸められる。(C++11まで)
- 割り算は0の方へ丸められる(分数の部分は捨てる)。(C++11から)
-
a / b
が表現可能であれば(a/b)*b + a%b == a
が成り立つ。
ということで、C++11以降に準拠しているコンパイラであれば負の整数で割り算や余りの計算ができるようです。
そこで、簡単な実験をしてみました。
#include <iostream>
void test(volatile int a, volatile int b) {
volatile int res = a / b;
std::cout << a << " / " << b << " = " << res << std::endl;
}
int main() {
test(5, 3);
test(5, -3);
test(-5, 3);
test(-5, -3);
}
一応、コンパイル中でなく実行時に計算しておこうと思ったため volatile
をつけています。
これを
- OS: Ubuntu 16.04
- コンパイラ: GCC 7.2.0
- オプション: -std=c++17
で実行した結果、
5 / 3 = 1
5 / -3 = -1
-5 / 3 = -1
-5 / -3 = 1
と予定通りの結果が返ってきました。
このようにコンパイラがしっかりしていれば負の整数でも気にせず計算はできるようです。(そう言いつつ自分は使っていない。)