2010-08-30 2 views
135

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

int result; 

result = 125/100; 

или

result = 43/100; 

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

+0

Описание: *** подписанное * целочисленное деление усекает к нулю **. Для неотрицательных результатов это то же самое, что и слово (round to -Infinity). (Остерегайтесь, что C89 не гарантирует этого, см. Ответы.) –

ответ

135

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

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

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

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

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

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

Конечно, две точки, чтобы отметить следующие:

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

и:

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

[Примечание: Упор мой]

+11

... если, конечно, вы не делите отрицательное число на положительный (или v.v.), и в этом случае это будет потолок. –

+53

Это ни пол, ни потолок, это усечение дробной части, это принципиально другое! – Wizard79

+25

@Will A: Нет. Он определяется как усечение в направлении нуля. Призыв к чему-нибудь еще, просто добавит к путанице, поэтому, пожалуйста, воздержитесь от этого. –

11

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

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

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

+38

Усечение, * не * пол. – dan04

+7

@ dan04: yep floor был бы действителен только для целых положительных чисел :) – Leonid

15

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

+2

Я согласен с комментарием, интересно ли иметь (отрицательный процент pos) отрицательный когда-либо полезный? Что касается связанного примечания, я задаюсь вопросом, полезно ли когда-либо полезное арифметически-неправильное поведение в некоторых случаях «unsignedvar> signedvar»? Я могу понять, почему не требуется всегда правильное поведение; Я не вижу оснований для неправильного поведения. – supercat

+6

+1 для отличной справки о том, почему напольное покрытие является правильным поведением для целочисленного деления (в отличие от определения C, которое нарушается и почти никогда не бывает полезным). –

+0

правильный и точный. +1. –

33

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

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

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

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

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

+0

И в предисловии С99 к проекту N1256 в п. 5 упоминается «надежное целочисленное деление» как новая языковая функция. Удивительный '* - *'. –

+0

Усечение - это то, как ведет себя наиболее распространенное процессорное оборудование (например, x86), поэтому было бы безумно делать другой выбор. IDK, который первым пришел, семантика Fortran или аппаратное поведение, но это не совпадение, что все те же. –

10

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

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

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

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

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

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 

 Смежные вопросы

  • Нет связанных вопросов^_^