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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top