Qual é o comportamento da divisão inteira?
-
25-09-2019 - |
Pergunta
Por exemplo,
int result;
result = 125/100;
ou
result = 43/100;
O resultado sempre será o chão da divisão? Qual é o comportamento definido?
Solução
O resultado sempre será o chão da divisão? Qual é o comportamento definido?
Sim, quociente inteiro dos dois operandos.
6.5.5 Operadores multiplicativos
6 Quando os números inteiros são divididos, o resultado do operador é o quociente algébrico com qualquer parte fracionária descartada.88) Se o quociente A/B for representável, a expressão (A/B)*B + A%B deve ser igual a.
e a nota de rodapé correspondente:
88) Isso é frequentemente chamado de '' truncamento em relação a zero ''.
Claro que dois pontos a serem observados são:
3 As conversões aritméticas usuais são realizadas nos operandos.
e:
5 O resultado do operador é o quociente da divisão do primeiro operando a cada segundo; O resultado do operador % é o restante. Nas duas operações, se o valor do segundo operando for zero, o comportamento será indefinido.
Nota: ênfase minha
Outras dicas
Dirkgentemente dá uma excelente descrição da divisão inteira em C99, mas você também deve saber que na divisão Integer C89 com um operando negativo tem uma direção definida por implementação.
Do rascunho da ANSI C (3.3.5):
Se um operando for negativo, se o resultado do / operador é o maior número inteiro menor que o quociente algébrico ou o menor número inteiro maior que o quociente algébrico é definido pela implementação, assim como o sinal do resultado do operador %. Se o quociente A/B for representável, a expressão (A/B)*B + A%B deve ser igual a.
Portanto, cuidado com números negativos quando você estiver preso a um compilador C89.
É um fato divertido que o C99 escolheu o truncamento em relação a zero, porque foi assim que Fortran fez isso. Ver esta mensagem em comp.std.c.
Onde o resultado é negativo, C trunca para 0 e não o piso - aprendi essa leitura sobre por que a divisão inteira do Python sempre pisos aqui: Por que os pisos da divisão inteira de Python
Sim, o resultado é sempre truncado para zero. Vai arredondar em direção ao menor valor absoluto.
-5 / 2 = -2
5 / 2 = 2
Para valores assinados não assinados e não negativos, esse é o mesmo que o piso (arredondando -se em direção a -infinity).
O resultado sempre será o chão da divisão?
Não. O resultado varia, mas a variação ocorre apenas para valores negativos.
Qual é o comportamento definido?
Para deixar claro as rodadas de piso em direção ao infinito negativo, enquanto a divisão inteira rodadas em direção a zero (truncados)
Para valores positivos, eles são os mesmos
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Para valor negativo, isso é diferente
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0