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

Например,

int result;

result = 125/100;

или

result = 43/100;

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

195
задан Lundin 21 May 2017 в 20:51
поделиться

4 ответа

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

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

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

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

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

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

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

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

и:

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

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

168
ответ дан 23 November 2019 в 05:22
поделиться

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

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

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

20
ответ дан 23 November 2019 в 05:22
поделиться

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

Из черновика ANSI C (3.3.5):

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

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

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

39
ответ дан 23 November 2019 в 05:22
поделиться

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

22
ответ дан 23 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: