Определяет ли ANSI C или ISO C, что такое -5% 10?

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

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 результат определяется реализацией (§5.6 / 4), следуя определению C89, но упоминает, что правило round-to-zero является предпочтительным,

… Если оба операнда неотрицательны, то остаток неотрицателен; если нет, знак остатка определяется реализацией 74) .

74) В соответствии с работой по пересмотру ISO C предпочтительный алгоритм для целочисленного деления следует правилам, определенным в стандарте ISO Fortran, ISO / IEC 1539: 1991, в котором фактор всегда округляется до нуля.

и действительно, это становится стандартным правилом в C ++ 0x (§5.6 / 4):

… Для интегральных операндов оператор / дает алгебраическое отношение с любой дробной частью, отброшенной; 82

82) Это часто называют усечением к нулю.

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

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


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

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

  • Меню:

  • Выполнение перевода ::

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