Каково поведение целочисленного деления? - PullRequest
186 голосов
/ 30 августа 2010

Например,

int result;

result = 125/100;

или

result = 43/100;

В результате всегда будет пол дивизиона?Что такое определенное поведение?

Ответы [ 5 ]

161 голосов
/ 30 августа 2010

В результате всегда будет пол дивизиона?Что такое определенное поведение?

Да, целое отношение двух операндов.

6.5.5 Мультипликативные операторы

6 Когда целые числа делятся, результатом оператора / является алгебраическое частное с любой отброшенной дробной частью. 88) Если частное a / b представимо, выражение (a / b) * b + a% b должно равняться a.

и соответствующей сноске:

88) Это часто называют «усечением до нуля».

Конечно, два замечания:

3 Обычные арифметические преобразования выполняются над операндами.

и:

5 Результатом оператора / является частное от деления первого операнда на второй;результат оператора% - остаток. В обеих операциях, если значение второго операнда равно нулю, поведение не определено.

[Примечание: выделено мной]

38 голосов
/ 31 августа 2010

Dirkgently дает превосходное описание целочисленного деления в C99, но вы также должны знать, что в C89 целочисленное деление с отрицательным операндом имеет направление, определяемое реализацией.

Из чертежа ANSI C (3.3.5):

Если любой из операндов отрицателен, то, является ли результат оператора / наибольшим целым числом, меньшим, чем алгебраический фактор, или наименьшим целым числом, большим, чем алгебраический фактор, определяется реализацией, как и знак результата оператора% , Если частное a / b представимо, выражение (a / b) * b + a% b должно равняться a.

Так что следите за отрицательными числами, когда вы застряли с компилятором C89.

Это забавный факт, что C99 выбрал усечение до нуля, потому что именно так сделал это ФОРТРАН. См это сообщение на comp.std.c.

20 голосов
/ 30 августа 2010

Там, где результат отрицательный, C усекается до 0, а не по полу - я узнал это чтение о том, почему целочисленное деление Python всегда здесь: Почему этажи целочисленного деления Python

18 голосов
/ 30 августа 2010

Да, результат всегда обрезается до нуля. Оно округляется до наименьшего абсолютного значения.

-5 / 2 = -2
 5 / 2 =  2

Для неподписанных и неотрицательных значений со знаком это то же самое, что и floor (округление до -Infinity).

12 голосов
/ 06 февраля 2015

Результатом всегда будет пол дивизиона?

Нет.Результат варьируется, но вариация происходит только для отрицательных значений.

Какое поведение определяется?

Чтобы было ясно, как округлять минимальные числа, а целые - делитьк нулю (усечено)

Для положительных значений они одинаковы

int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0

Для отрицательных значений это разные значения

int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
...