Каково поведение целочисленного деления?

Например,

int result;

result = 125/100;

или

result = 43/100;

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

Ответы

Ответ 1

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

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

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

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

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

88) Это часто называют "усечением к нулю".

Конечно, нужно отметить два момента:

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

а также:

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

[Примечание: Акцент мой]

Ответ 2

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

Из проекта ANSI C (3.3.5):

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

Поэтому следите за отрицательными цифрами, когда вы застряли в компиляторе C89.

Это забавный факт, что C99 выбрал усечение к нулю, потому что именно так FORTRAN это сделал. См. Это сообщение на comp.std.c.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Будет ли всегда быть пол деления?

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

Что такое определенное поведение?

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

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

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