оператор модуля c - PullRequest
       1

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

1 голос
/ 22 июня 2010

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

Ответы [ 5 ]

3 голосов
/ 22 июня 2010

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

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

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

2 голосов
/ 22 июня 2010

В C99

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

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

1 голос
/ 22 июня 2010

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

... признаком результата для% являются машинно-зависимый для отрицательного операнды, как и действие, предпринятое переполнение или недостаток.

1 голос
/ 22 июня 2010

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

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

0 голосов
/ 22 июня 2010

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

unsigned mod10(int a)
{
    int b = a % 10;
    return b < 0 ? b + 10 : b;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...