Help us understand the problem. What is going on with this article?

C++における負の整数の割り算および余りについて

More than 1 year has passed since last update.

このメモはC++で整数abに対して a / ba % b を実行する際、abが負の数だったときどうなるのかを調べてみた結果です。

ネット上のドキュメントを見ると、
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

と予定通りの結果が返ってきました。
このようにコンパイラがしっかりしていれば負の整数でも気にせず計算はできるようです。(そう言いつつ自分は使っていない。)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away