Как поведение целочисленного деления?
-
25-09-2019 - |
Вопрос
Например,
int result;
result = 125/100;
или
result = 43/100;
Результат всегда будет пол дивизии? Что такое определенное поведение?
Решение
Результат всегда будет пол дивизии? Что такое определенное поведение?
Да, целое число двух операндов.
6.5.5 Мультипликативные операторы
6 Когда целые числа делятся, результат / оператор / оператор является алгебраическим фактором с любой дробной частью отброшенной.88) Если фактор A / B представлен, выражение (A / B) * B + A% B должна равняться.
и соответствующая сноска:
88) Это часто называют «усечением к нулю».
Конечно, два пункта к примечанию:
3 Обычные арифметические преобразования выполняются на операндах.
а также:
5 Результат / оператор является частным из разделения первого операнда на второй; Результатом оператора% является остатком. В обеих операциях, если значение второго операнда равен нулю, поведение не определено.
Примечание: упор мой
Другие советы
Диркратно дает Отличное описание Целочисленного отдела в C99, но вы также должны знать, что в C89 целочисленное разделение с отрицательным операндом имеет определенное внедрение направление.
От проекта ANSI C (3.3.5):
Если операнд отрицателен, будь то результат / оператор / оператор наибольшим целым числом, меньше, чем алгебраический фактор или наименьшее целое число, превышающее, чем алгебраический фактор, определяется, как является признаком результата% оператора. Если фактор A / B представлен, выражение (A / B) * B + A% B должна равняться.
Так что следите за отрицательными числами, когда вы застряли с компилятором C89.
Забавный факт, что C99 выбрал усечение к нулю, потому что это было, как Фортран сделал это. Видеть это сообщение на комп.
Там, где результат негативно, C укорены к 0, а не на полу - я узнал, что это чтение о том, почему дивизион Python Integer всегда этажей здесь: Почему целочисленные деления Python
Да, результат всегда урезан к нулю. Он будет окружен к самой маленькой абсолютной ценности.
-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