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


например,

int result;

result = 125/100;

или

result = 43/100;

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

5 156

5 ответов:

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

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

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

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

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

88) это часто называют ‘усечением к нулю’.

конечно, следует отметить два момента:

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

и:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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