C89, не полностью (раздел 3.3.5 / 6). Это может быть либо -5, либо 5, поскольку -5 / 10 может возвращать 0 или -1 (%
определяется в терминах линейного уравнения, включающего /
, *
и +
):
Когда целые числа делятся и деление является неточным, если оба операнда положительны, результат оператора /
является наибольшим целым числом, меньшим алгебраического отношения, а результат оператора %
положителен. Если любой из операндов отрицателен , то, является ли результат оператора /
наибольшим целым числом, меньшим, чем алгебраический фактор, или наименьшим целым числом, большим, чем алгебраический фактор, определяется реализацией , как знак результата оператора %
. Если частное a/b
представимо, выражение (a/b)*b + a%b
должно равняться a
.
C99, да (раздел 6.5.5 / 6), результат должен быть -5:
Когда целые числа делятся, результатом оператора /
является алгебраическое частное с любой отброшенной дробной частью. 88) Если частное a/b
представимо, выражение (a/b)*b + a%b
должно быть равно a
.
88) Это часто называют «усечением до нуля».
Аналогично, в C ++ 98 результат определяется реализацией (& sect; 5.6 / 4), следуя определению C89, но упоминает, что правило округления до нуля является предпочтительным,
... Если оба операнда неотрицательны, то остаток неотрицателен; если нет, то знак остатка определяется реализацией 74) .
74) В соответствии с проводимой работой по пересмотру ISO C предпочтительный алгоритм целочисленного деления следует правилам, определенным в стандарте ISO Fortran, ISO / IEC 1539: 1991, в котором частное всегда округляется до нуля.
и действительно это становится стандартным правилом в C ++ 0x (& sect; 5.6 / 4):
... Для целочисленных операндов оператор /
возвращает алгебраический коэффициент с любой отброшенной дробной частью; 82 ...
82) Это часто называют усечением до нуля.