Почему C ++ выводит отрицательные числа при использовании по модулю?

Math:

Если у вас есть такое уравнение:

x = 3 mod 7

х может быть ... -4, 3, 10, 17, ... или, в более общем случае:

x = 3 + k * 7

где k может быть любым целым числом. Я не знаю, какая операция по модулю определена для математики, но фактор-кольцо, безусловно, таков.

Python:

В Python вы всегда получите неотрицательные значения при использовании% с положительнымm:

#!/usr/bin/python
# -*- coding: utf-8 -*-

m = 7

for i in xrange(-8, 10 + 1):
    print(i % 7)

Результаты в:

6    0    1    2    3    4    5    6    0    1    2    3    4    5    6    0    1    2    3

C++:

#include <iostream>

using namespace std;

int main(){
    int m = 7;

    for(int i=-8; i <= 10; i++) {
        cout << (i % m) << endl;
    }

    return 0;
}

Будет выводить:

-1    0    -6    -5    -4    -3    -2    -1    0    1    2    3    4    5    6    0    1    2    3    

ISO/IEC 14882:2003(E) - 5.6 Multiplicative operators:

The binary / operator yields the quotient, and the binary % operator yields the remainder from the division of the first expression by the second. If the second operand of / or % is zero the behavior is undefined; otherwise (a/b)*b + a%b is equal to a. If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined 74).

а также

74) According to work underway toward the revision of ISO C, the preferred algorithm for integer division follows the rules defined in the ISO Fortran standard, ISO/IEC 1539:1991, in which the quotient is always rounded toward zero.

Источник:ISO / IEC 14882: 2003 (E)

(Я не смог найти бесплатную версиюISO/IEC 1539:1991, Кто-нибудь знает, где его взять?)

Кажется, что операция определена так:

enter image description here

Question:

Есть ли смысл определять это так?

Каковы аргументы для этой спецификации? Есть ли место, где люди, которые создают такие стандарты, обсуждают это? Где я могу прочитать кое-что о причинах, почему они решили сделать это таким образом?

Большую часть времени, когда я использую модуль, я хочу получить доступ к элементам структуры данных. В этом случае я должен убедиться, что мод возвращает неотрицательное значение. Таким образом, для этого случая было бы хорошо, чтобы мод всегда возвращал неотрицательное значение. (Другое использованиеЕвклидов алгоритм, Поскольку вы можете сделать оба числа положительными перед использованием этого алгоритма, знак по модулю будет иметь значение.)

Additional material:

УвидетьВикипедия для длинного списка того, что по модулю делает на разных языках.

Ответы на вопрос(3)

Ваш ответ на вопрос