Кажется, я помню, что ANSI C не указывал, какое значение должно быть возвращено, когда либо операнд оператора modulo отрицателен (просто он должен быть последовательным). Он был указан позже или всегда был указан, и я неправильно помню?
Определяет ли ANSI C или ISO C, что такое -5% 10?
Ответ 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) Поведение, определяемое реализацией. Некоторые варианты выполняются библиотекой и операционной системой (или другими среда при компиляции для автономной среды); Ссылаться на их документацию для деталей.
Меню
Выполнение перевода::
- Выполнение среды::
- Реализация идентификаторов::
- Выполнение символов::
- Целые реализации:
- Реализация с плавающей запятой::
- Реализация массивов и указателей::
- Реализация подсказок::
- Структуры перечислений объединений и реализация битовых полей::
- Выполнение квалификаторов::
- Реализация деклараторов::
- Выполнение выражений::
- Реализация директив предварительной обработки::
- Реализация библиотечных функций::
- Реализация архитектуры::
- Локальная реализация поведения: