Указывает ли ANSI C или ISO C, что должно быть?
Вопрос
Кажется, я помню, что ANSI C не указывал, какое значение должно быть возвращено, когда Operand Modulo Operator является отрицательным (только что оно должно быть последовательным). Указал ли это позже, или он всегда был указан, и я помню неправильно?
Решение
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, но упоминает, что круглое правило нулевого нуля является предпочтительным,
... Если обе операнды неотрицательны, то остаток неотрицательна; Если нет, знак остатка определен в реализации74).
74) В соответствии с работой в пути к пересмотру ISO C, предпочтительный алгоритм для целочисленного деления следует правилам, определенным в стандарте ISO Fortran, ISO / IEC 1539: 1991, в котором фактор всегда округляется в сторону нуля.
И действительно, это становится стандартным правилом в C ++ 0x (§5.6 / 4):
... для интегральных операндов
/
Оператор дает алгебраическую встречу с любой дробной частью, отброшенной;82 ...82) Это часто называют усечением к нулю.
Другие советы
Чтобы добавить немного детали к ответу Кеннитма: если стандарты C звоните что-то Определена реализация Тогда эта реализация требуется Для документирования выбора это делает. Обычно это было бы в документации с компилятором или библиотекой (страница человека, справочная информация, печатные документы, буклет CD :-) любая реализация, подтверждающая соответствие C89 или более поздней версии должен предоставить это где-нибудь. Попробуйте искать такой документ. На случай, если gcc
Например, это в GCC-INFO:
4 C, определенное внедрением поведение
Соответствующая реализация ISO C требуется для документирования его выбора поведения в каждой из областей, предназначенных для обозначенных «определения реализации». В следующие перечислены все такие области, наряду с номерами секции из стандартов ISO / IEC 9899: 1990 и ISO / IEC 9899: 1999. Некоторые области являются только реализацией, определенные в одной версии стандарта.
Некоторые варианты зависят от внешнего определенного ABI для платформы (включая стандартные кодировки символов), которые следует; Они указаны как «определяются ABI» ниже. * Примечание Двоичная совместимость: совместимость и «http://gcc.gnu.org/readings.html». Некоторые выборы документируются в руководстве на препроцессор. * Примечание. Определенное внедрение поведения: (CPP), определенное внедрением поведение. Некоторый выбор изготовлен в библиотеке и операционной системе (или другой среде при составлении отдельно стоящей среды); Обратитесь к их документации для деталей.
Меню:
Реализация перевода ::
- Реализация окружающей среды ::
- Реализация идентификаторов ::
- Реализация персонажей ::
- Реализация целых чисел ::
- Реализация с плавающей точкой ::
- Реализация массивов и указателей ::
- Реализация подсказок ::
- Структуры профсоюзов перечисления и реализация битовых полей ::
- Реализация квалификации ::
- Реализаторы реализации ::
- Реализация заявлений ::
- Реализация директив для предварительной обработки ::
- Реализация библиотечных функций ::
- Реализация архитектуры ::
- Реализация по поведению, специфическое локаль ::