residuo - ¿Cuál es el comportamiento de la división de enteros?
division de numeros enteros (5)
¿El resultado siempre será el piso de la división? ¿Cuál es el comportamiento definido?
Sí, cociente entero de los dos operandos.
6.5.5 Operadores multiplicativos
6 Cuando los enteros se dividen, el resultado del operador / es el cociente algebraico con cualquier parte fraccional descartada. 88) Si el cociente a / b es representable, la expresión (a / b) * b + a% b será igual a.
y la nota al pie correspondiente:
88) Esto a menudo se llama "truncamiento hacia cero".
Por supuesto, dos puntos a tener en cuenta son:
3 Las conversiones aritméticas habituales se realizan en los operandos.
y:
5 El resultado del operador / es el cociente de la división del primer operando por el segundo; el resultado del operador% es el resto. En ambas operaciones, si el valor del segundo operando es cero, el comportamiento no está definido.
[Nota: Énfasis mío]
Por ejemplo,
int result;
result = 125/100;
o
result = 43/100;
¿El resultado siempre será el piso de la división? ¿Cuál es el comportamiento definido?
¿El resultado siempre será el piso de la división?
No. El resultado varía, pero la variación solo ocurre con valores negativos.
¿Cuál es el comportamiento definido?
Para que quede claro, redondea el piso hacia el infinito negativo, mientras que la división entera redondea hacia cero (trunca)
Para valores positivos son los mismos
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Por valor negativo esto es diferente
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
Dirkgently ofrece una excelente descripción de la división de enteros en C99, pero también debe saber que en C89 la división entera con un operando negativo tiene una dirección definida por la implementación.
Del borrador de ANSI C (3.3.5):
Si cualquiera de los operandos es negativo, si el resultado del operador / es el entero más grande menor que el cociente algebraico o el entero más pequeño mayor que el cociente algebraico está definido por la implementación, como es el signo del resultado del operador%. Si el cociente a / b es representable, la expresión (a / b) * b + a% b será igual a.
Así que ten cuidado con los números negativos cuando estás atrapado con un compilador C89.
Es un hecho divertido que C99 eligió el truncamiento hacia cero porque así fue como lo hizo FORTRAN. Vea este mensaje en comp.std.c.
Donde el resultado es negativo, C trunca hacia 0 en lugar de piso - Aprendí esta lectura acerca de por qué la división de enteros de Python siempre está aquí: Por qué Python''s Integer Division Floors
Sí, el resultado siempre se trunca hacia cero. Va a redondear hacia el valor absoluto más pequeño.
-5 / 2 = -2
5 / 2 = 2
Para los valores con signo sin signo y sin signo negativo, esto es lo mismo que piso (redondeo hacia -Infinito).