Указывает ли ANSI C или ISO C, что должно быть -5% 10? - PullRequest
19 голосов
/ 31 августа 2010

Кажется, я помню, что в ANSI C не было указано, какое значение должно быть возвращено, если любой из операндов оператора по модулю отрицателен (просто он должен быть непротиворечивым). Это было указано позже, или это было всегда указано, и я помню неправильно?

Ответы [ 2 ]

40 голосов
/ 31 августа 2010

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) Это часто называют усечением до нуля.

3 голосов
/ 23 декабря 2012

Чтобы добавить небольшую деталь к ответу KennyTM: если стандарты C вызывают что-то, определенное реализацией , то эта реализация требуется , чтобы задокументировать сделанный выбор.Обычно это указывается в документации компилятора или библиотеки (справочная страница, справочное руководство, печатные документы, буклет на компакт-диске :-). Любая реализация, заявляющая о соответствии C89 или более поздней версии , должна предоставить это где-нибудь.Попробуйте поискать такой документ.Например, в случае gcc это указывается в gcc-info:

4 C Поведение, определяемое реализацией


Требуется соответствующая реализация ISO Cдокументировать свой выбор поведения в каждой из областей, которые обозначены как «определенные реализацией».Ниже перечислены все такие области, а также номера разделов из стандартов ИСО / МЭК 9899: 1990 и ИСО / МЭК 9899: 1999.Некоторые области определяются только реализацией в одной версии стандарта.

Некоторые варианты зависят от внешне определенного ABI для платформы (включая стандартные кодировки символов), которому следует GCC;они перечислены как «определенные ABI» ниже.* Примечание Бинарная совместимость: Совместимость и `http://gcc.gnu.org/readings.html'. Некоторые варианты описаны в руководстве препроцессора.* Примечание. Определенное реализацией поведение: (cpp) Определенное реализацией поведение.Некоторые варианты делаются библиотекой и операционной системой (или другой средой при компиляции для автономной среды);подробности см. в их документации.

  • Меню:

  • Реализация перевода ::

  • Реализация среды ::
  • Реализация идентификаторов ::
  • Реализация символов ::
  • Реализация целых чисел ::
  • Реализация с плавающей точкой ::
  • Массивы и указателиреализация ::
  • Реализация подсказок ::
  • Структурирование объединений перечислений и реализация битовых полей ::
  • Реализация квалификаторов ::
  • Реализация деклараторов ::
  • Реализация операторов ::
  • Реализация директив предварительной обработки ::
  • Реализация библиотечных функций ::
  • Реализация архитектуры ::
  • Специфичные для локалиреализация поведения ::
...