2009-09-29 9 views
12
class Main { 
    public static void main (String[] args){ 
    long value = 1024 * 1024 * 1024 * 80; 
    System.out.println(Long.MAX_VALUE); 
    System.out.println(value); 
    } 
} 

de salida es:¿Multiplicar valores largos?

 
9223372036854775807 
0 

Es correcto si long value = 1024 * 1024 * 1024 * 80L;!

Respuesta

35

En Java, todas las operaciones matemáticas se realizan en el tipo de datos más grande requerido para manejar todos los valores actuales. Por lo tanto, si tiene int * int, siempre realizará las operaciones matemáticas como un entero, pero int * long se realiza como un largo.

En este caso, el 1024 * 1024 * 1024 * 80 se realiza como un Int, que se desborda int.

La "L" obliga a uno de los operandos a ser un Int-64 (largo), por lo tanto, todas las operaciones matemáticas se realizan almacenando los valores como Long, por lo que no se produce desbordamiento.

+3

aritmética en, por ejemplo, 'short's no se hace como' short's, está hecho como 'int's . –

+0

Tom- Eso es muy interesante, nunca lo había sabido. Acabo de probarlo con dos cortos (en C#, pero acción similar), y HIZO la matemática como un entero ... Debe ser simplemente el uso de un int como el valor predeterminado para los tipos numéricos simples. – Erich

+0

es decir corto x = 0; corto y = 0; x = x + y; daría un error de desajuste de tipo. – pmu

4

Los literales enteros son int s. El desbordamiento int s. Use el sufijo L.

long value = 1024L * 1024L * 1024L * 80L; 

Si los datos provienen de variables ya sea de fundido o asignar a longs de antemano.

long value = (long)a * (long)b; 

long aL = a; 
long bL = b; 
long value = aL*bL 

Estrictamente hablando, puede salirse con la suya con menos suficiencias, pero es probable que sea mejor dejarlo en claro.

También no se puede confundir la l minúscula como un 1.

1

Sospecho que es porque de forma predeterminada java trata los literales como enteros, no como anhelos. Entonces, sin L en 80, la multiplicación se desborda.

1

este código:

long value = 1024 * 1024 * 1024 * 80; 

multiplica algunos números enteros juntos, lo convierte en un largo y entonces asigna el resultado a una variable. La multiplicación real se realizará mediante javac en lugar de cuando se ejecuta.

Dado que int es de 32 bits, el valor se ajusta y da como resultado un cero.

Como dices, usar valores largos en el lado derecho dará un resultado que solo se ajusta si supera los 64 bits.

1

Si he entendido correctamente, por su exigencia, que querían multiplicar estos valores 1024 * 1024 * 1024 * 80;

En calculadora que veo valores próximos 1024 * 1024 * 1024 * 80 = 85899345920.

Aquí tienes el código Java: Estos son cálculo del valor monetario en Java

import java.math.BigDecimal; 
public class Demo { 
    public static void main(String[] args) { 
     BigDecimal bd1 = new BigDecimal("1024"); 
     BigDecimal bd2 = new BigDecimal("1024"); 
     BigDecimal bd3 = new BigDecimal("1024"); 
     BigDecimal bd4 = new BigDecimal("80"); 
     BigDecimal bd5 = bd1.multiply(bd2).multiply(bd3).multiply(bd4); 
     System.out.println(bd5); // output comes: 85899345920 
    } 
}