java - positivos - negativo mas negativo da positivo
La multiplicación de dos int se vuelve negativa (4)
Debería utilizar un binario largo - 2147760000 en 10000000 00000100 00110111 10000000 y dado que el bit más significativo es 1, se interpreta como un número negativo.
Actualmente estoy programando un pequeño administrador de descargas y obtengo un resultado divertido cuando trato de calcular el progreso de la descarga en porcentaje. Esto es lo que uso para calcularlo:
int progress = (byte_counter * 100) / size;
System.out.println("("+byte_counter+" * 100) = "+(byte_counter * 100)
+" / "+size+" = "+progress);
byte-counter
es un int (cuenta el total de bytes leídos del InputStream
) y el size
es la longitud del archivo descargado en bytes.
Esto funciona muy bien con pequeñas descargas. Pero cuando llego a archivos más grandes (40MB) comienza a hacer cosas graciosas. La salida para el cálculo se ve así:
[...]
(21473280 * 100) = 2147328000 / 47659008 = 45
(21474720 * 100) = 2147472000 / 47659008 = 45
(21476160 * 100) = -2147351296 / 47659008 = -45
(21477600 * 100) = -2147207296 / 47659008 = -45
[...]
No sé por qué, pero el cálculo se vuelve negativo. Como un entero normal debería estar bien con números hasta 2 31 -1, este no debería ser el problema raíz. Pero, ¿qué me estoy perdiendo?
Ver http://en.wikipedia.org/wiki/Arithmetic_overflow
Para solucionarlo en java, intente utilizar un long
lugar.
int progress = (int) ((byte_counter * 100L) / size);
o el orden inverso de las operaciones
int progress = (int) (((float) byte_counter) / size) * 100);
21476160 * 100 = 2 147 616 000
es mayor que 2 147 483 647
, el máximo int.
Estás desbordando
Use long
para sus cálculos.
2^31-1 = 2147483647 < 21476160 * 100 = 2147616000