2010-08-30 14 views
135

Por ejemplo,¿Cuál es el comportamiento de la división de enteros?

int result; 

result = 125/100; 

o

result = 43/100; 

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

+0

Resumen: *** signed * la división entera se trunca hacia cero **. Para resultados no negativos, esto es lo mismo que piso (redondeado hacia -Infinito). (Tenga en cuenta que C89 no lo garantiza, consulte las respuestas.) –

Respuesta

135

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

Sí, cociente entero de los dos operandos.

6.5.5 operadores multiplicativos

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

y la nota correspondiente:

88) Esto es a menudo llamado ‘‘truncamiento hacia cero’’.

Por supuesto dos puntos a tener en cuenta son:

Las conversiones aritméticas habituales se realizan sobre los operandos.

y:

El resultado de la/operador es el cociente de la división de la 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]

+11

... a menos, por supuesto, que esté dividiendo un número negativo por uno positivo (o v.v.), en cuyo caso será el límite máximo. –

+53

No es ni piso ni techo, es truncamiento de partes fraccionales, ¡es conceptualmente diferente! – Wizard79

+25

@Talla A: No. Se define como truncamiento hacia cero. Llamarlo de otra manera solo aumentará la confusión así que por favor absténgase de hacerlo. –

11

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 valores sin signo y no negativos firmados, esto es lo mismo que piso (redondeo hacia -Infinity).

+38

Truncamiento, * no * piso. – dan04

+7

@ dan04: sip floor sería válido solo para enteros positivos :) – Leonid

15

Cuando el resultado es negativo, C trunca hacia 0 en lugar de suelo - Esto lo aprendí leyendo acerca de por qué la división entera de Python siempre plantas aquí: Why Python's Integer Division Floors

+2

Estoy de acuerdo con el comentario preguntándome si tener (neg% pos) ir negativo es útil alguna vez? En una nota relacionada, me pregunto si el comportamiento aritméticamente incorrecto requerido en algunos casos de "unsignedvar> signedvar" siempre es útil. Puedo entender la razón para no requerir un comportamiento siempre correcto; No veo razones para exigir un comportamiento incorrecto. – supercat

+6

+1 para una excelente referencia sobre por qué el suelo es el comportamiento correcto para la división de enteros (contrariamente a la definición de C, que está rota y casi nunca es útil). –

+0

correcto y preciso. +1. –

33

Dirkgently da an excellent description de división entera 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.

Desde el proyecto de ANSI C (3.3.5):

Si alguno de los operandos es negativo, si el resultado de la/operador es el entero más grande menor que el cociente algebraica o el número entero más pequeño mayor que la el cociente algebraico es definido por la implementación, como lo 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.

Tenga cuidado con los números negativos cuando está atascado con un compilador C89.

Es un hecho divertido que C99 eligió el truncamiento hacia cero porque así fue como lo hizo FORTRAN. Ver this message en comp.std.c.

+0

Y el preámbulo del borrador C99 N1256, párrafo 5, menciona 'división entera confiable 'como una nueva función de idioma. Increíble '* - *'. –

+0

El truncamiento es la forma en que se comporta el hardware de CPU más común (por ejemplo, x86), por lo que sería una locura tomar una decisión diferente. IDK que fue primero, semántica de Fortran o comportamiento de hardware, pero no es una coincidencia que esos sean los mismos también. –

10

¿El resultado será siempre 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 sea rondas de suelo libre hacia el infinito negativo, mientras que la división entera redondea hacia cero (truncados)

Para valores positivos que 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 
Cuestiones relacionadas