2011-03-16 10 views
5

trato de dividir int por unsigned int y me da resultado inesperado:int dividido por unsigned int causando vuelco

int b; 
unsigned int c; 
int res; 
float res_f; 

b = -25; 
c = 5; 

res = b/c; // res = 858993454 
res_f = b/c; // res_f = -5.000000 

Lo mismo funciona bien para '+', '-' y '*', pero falla para '/'. ¿Qué es lo que extraño aquí?

P.S.

Se probó en diferentes compiladores y el resultado fue el mismo.

+1

¿Qué lenguaje de programación? –

Respuesta

11

Asumiendo que esto es C o similar (por ejemplo, C Objetivo), el cambio:

res = b/c; 

a:

res = b/(int)c; 

Explicación: b está siendo convertido de int a unsigned int, de acuerdo con la conversión de tipo de C reglas para expresiones mixtas. En el proceso, se desborda de -25 a 0xFFFFFFE7 == 4294967271. Luego obtienes un resultado de unsigned int de 4294967271/5U = 858993454U, que luego se convierte implícitamente a int (sin desbordamiento en este paso, ya que el resultado está en el rango de entradas de 32 bits tanto firmadas como no firmadas). Por supuesto, el resultado float debe ser el mismo, dentro de los límites de precisión de float (obtengo 858993472.0). Me sorprende que obtengas -5.0 en este caso.

+0

Es por eso que los idiomas con conversiones de tipo implícito son malos. Si no quieres que te sucedan cosas así, utiliza un lenguaje con un sistema de tipos muy sólido, como Ada. –

+0

Hacer 'c' un' unsigned short' también funciona si tiene más sentido en contexto. – aaz

+1

Su edición reemplazó un error tipográfico con otro error tipográfico ... :-D –

Cuestiones relacionadas