Вопрос

Кажется, я помню, что 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), определенное внедрением поведение. Некоторый выбор изготовлен в библиотеке и операционной системе (или другой среде при составлении отдельно стоящей среды); Обратитесь к их документации для деталей.

  • Меню:

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

  • Реализация окружающей среды ::
  • Реализация идентификаторов ::
  • Реализация персонажей ::
  • Реализация целых чисел ::
  • Реализация с плавающей точкой ::
  • Реализация массивов и указателей ::
  • Реализация подсказок ::
  • Структуры профсоюзов перечисления и реализация битовых полей ::
  • Реализация квалификации ::
  • Реализаторы реализации ::
  • Реализация заявлений ::
  • Реализация директив для предварительной обработки ::
  • Реализация библиотечных функций ::
  • Реализация архитектуры ::
  • Реализация по поведению, специфическое локаль ::
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top