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

Например,

int result;

result = 125/100;

или же

result = 43/100;

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

7 ответов

Решение

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

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

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

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

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

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

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

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

а также:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я знаю, что люди ответили на ваш вопрос, но с точки зрения непрофессионала:

5 / 2 = 2 // так как и 5, и 2 являются целыми числами, а деление целых чисел всегда обрезает десятичные дроби

5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5 // здесь либо 5, либо 2, либо оба имеют десятичное значение, поэтому полученное частное будет десятичным.

Из алгебры: -i/j = i/(-j) = - (i/j)

Почему какой-либо язык программирования или компилятор противоречат этому фундаментальному принципу?

Другие вопросы по тегам