Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

C89, а не полностью (раздел 3.3.5/6). Это может быть либо -5 или 5, потому что -5/10 может возвращать 0 или -1 (% определяется в терминах линейного уравнения с участием /, * и +):

Когда целые числа делятся и деление неточно, если оба операнда положительны, результатом оператора / является наибольшее целое число, меньшее, чем алгебраическое отношение, а результат оператора % положителен. Если любой из операндов отрицательный, является ли результат оператора / наибольшим целым числом меньше, чем алгебраическое отношение, или наименьшее целое число, большее, чем алгебраическое отношение, определено в реализации > , как и знак результата оператора %. Если выражение a/b представимо, выражение (a/b)*b + a%b должно быть равно a.

C99, да (& section 6.5.5/6), результат должен быть -5:

Когда целые числа делятся, результатом оператора / является алгебраическое отношение с любой дробной частью, отброшенной. 88) Если фактор a/b представимо, выражение (a/b)*b + a%b должно равно a.

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


Аналогично, в С++ 98 результат определяется реализацией (& sect; 5.6/4), следуя определению C89, но упоминает, что правило round-to-zero является предпочтительным,

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

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

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

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

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

Ответ 2

Чтобы добавить небольшую информацию в ответ KennyTM: если стандарты C вызывают определенную реализацию, то эта реализация требуется для документирования выбора, который она делает. Обычно это было бы в документации для компилятора или библиотеки (справочная страница, справочное руководство, печатные документы, буклет на CD:-) Любая реализация, претендующая на соответствие 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) Поведение, определяемое реализацией. Некоторые варианты выполняются библиотекой и операционной системой (или другими среда при компиляции для автономной среды); Ссылаться на их документацию для деталей.

  • Меню

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

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