Intereting Posts
Как отказаться от предупреждения «преобразование в« char »из« int »может изменить его значение» Переписывание fragmentа кода C без условных операторов или операторов? Как работают фигурные скобки и область действия в C? Расположение указателей и глобальных переменных в C Спецификаторы Typedefs и printf Программа Ncurses завершается при изменении размера терминала C прочитайте буфер stdin перед отправкой Завершение работы Lua / Завершение обратного вызова выполнения программы Структурирование приложений C? Существует ли общий спецификатор преобразования для printf? Является ли int * array указателем на массив из 32 целых чисел или массив из 32 указателей на int? Это имеет значение? ncr в c (комбинации) как удалить ряд элементов из массива в c принять ввод char и сохранить его в массиве Как проверить, является ли пользовательский ввод плавающим числом в C?

c модуль оператора

что происходит, когда вы используете отрицательные операторы с%. пример -3% 2 или 3% -2

В C89, C90 и C ++ 03 стандарты требуют только (a/b)*b+a%b == a для операторов / и % .

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

Изменить: в C99 отрицательное число будет возвращено, если первый аргумент отрицательный

В C99

 -3%2=-1 3%-2=1 

В C90 -3%2 or 3%-2 -> Реализация определена

Оператор % дает остаток для целочисленного деления, так что (a / b) * b + (a % b) всегда равно a (если a / b представимо, в двухзначной нотации дополнения наибольшее отрицательное целое число, деленное на -1 не представимо).

Это означает, что поведение % связано с поведением / . До C99 направление округления для отрицательных операндов определялось реализацией, что означало, что результат % для отрицательных операндов был также определен в реализации. В C99 округление для / равно нулю (десятичные числа просто усечены), что также фиксирует поведение % в C99.

Согласно Kernighan & Ritchie, 2-е издание, стр. 39, 2.5:

… знак результата для% зависит от машины для отрицательных операндов, так же как и действие, выполняемое при переполнении или нижнем streamе.

В C99 a% b имеет знак a, в значительной степени похожий на fmod в math.h. Это часто то, что вы хотите:

 unsigned mod10(int a) { int b = a % 10; return b < 0 ? b + 10 : b; }