¿Cuál es el comportamiento de la división de números enteros?

Resuelto T.T.T. asked hace 14 años • 6 respuestas

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?

T.T.T. avatar Aug 31 '10 00:08 T.T.T.
Aceptado

¿El resultado siempre será el piso de la división? ¿Cuál es el comportamiento definido?

No exactamente. Se redondea hacia 0, en lugar de hacia el suelo.

6.5.5 Operadores multiplicativos

6 Cuando se dividen números enteros, el resultado del operador / es el cociente algebraico descartando cualquier parte fraccionaria. 88) Si el cociente a/b es representable, la expresión (a/b)*b + a%b será igual a a.

y la nota a pie de página correspondiente:

  1. Esto suele denominarse "truncamiento hacia cero".

Por supuesto, dos puntos a tener en cuenta son:

3 Sobre los operandos se realizan las conversiones aritméticas habituales.

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: el énfasis es mío]

dirkgently avatar Aug 30 '2010 17:08 dirkgently

Dirkgently ofrece una excelente descripción de la división de enteros en C99, pero también debes saber que en C89 la división de enteros con un operando negativo tiene una dirección definida por la implementación.

Del borrador 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, al igual que el signo del resultado del operador %. Si el cociente a/b es representable, la expresión (a/b)*b + a%b será igual a a.

Así que tenga cuidado con los números negativos cuando se quede atrapado con un compilador C89.

Es un hecho curioso que C99 eligió el truncamiento hacia cero porque así fue como lo hizo FORTRAN. Vea este mensaje en comp.std.c.

schot avatar Aug 30 '2010 23:08 schot

Sí, el resultado siempre se trunca hacia cero. Se redondeará hacia el valor absoluto más pequeño.

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

Para valores sin signo y con signo no negativo, esto es lo mismo que el piso (redondeando hacia -Infinito).

Leonid avatar Aug 30 '2010 17:08 Leonid

Cuando el resultado es negativo, C se trunca hacia 0 en lugar de piso. Aprendí esta lectura sobre por qué la división de enteros de Python siempre piso aquí: Por qué los pisos de división de enteros de Python

Gareth Williams avatar Aug 30 '2010 17:08 Gareth Williams