problemas positivos positivo por números numeros numero negativos negativo multiplicar multiplicacion mas hace ejercicios dividir cómo con como java int download-manager

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