В C89 / 90 любой результат был разрешен.Результаты, полученные от деления и остатка, должны были «соответствовать» друг другу, чтобы (a/b)*b + a%b == a
.
Начиная с C99, целочисленное деление с отрицательным входом требовалось для усечения до нуля.Отношение между результатами от деления и остатка все еще требуется.Это означает, что (в действительности) результат от операции остатка всегда имеет тот же знак, что и левый операнд, поэтому 25% -9 должно давать 7, а не -2.
Для чего это стоит, С ++ следовал примернотот же путь, всего несколько лет спустя после C. C ++ 98/03 имеет те же правила, что и C89 / 90, поэтому для ваших входных данных остаток может быть либо отрицательным, либо положительным (но все равно должен соответствовать результату деления).Начиная с C ++ 11, он требует того же поведения, что и C99, поэтому 25% - 9 == 7.
Некоторые другие языки (например, Python) требуют, чтобы результат от остатка имел тот же знак, что ивместо этого правый операнд.