2009-09-29 8 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); 
    } 
} 

sortie est:Multiplier les valeurs longues?

 
9223372036854775807 
0 

Il est correct si long value = 1024 * 1024 * 1024 * 80L;!

Répondre

35

En Java, tous les calculs sont effectués avec le plus grand type de données requis pour gérer toutes les valeurs actuelles. Donc, si vous avez int * int, il fera toujours le math comme un entier, mais int * long est fait comme un long.

Dans ce cas, le 1024 * 1024 * 1024 * 80 est fait comme un Int, qui déborde int. Le "L" force bien sûr l'un des opérandes à être un Int-64 (long), donc tout le calcul mathématique est fait en stockant les valeurs comme Long, donc aucun débordement ne se produit.

+3

Arithmétique, disons, 'short's ne se fait pas comme' short's, il est fait que 'int's . –

+0

Tom- C'est très intéressant, je ne l'avais jamais su. Je l'ai juste testé avec deux shorts (en C#, mais une action similaire), et il a fait les maths comme un Integer ... Il doit simplement utiliser un Int comme valeur par défaut pour les types numériques simples. – Erich

+0

, c'est-à-dire court x = 0; court y = 0; x = x + y; donnerait une erreur d'incompatibilité de type. – pmu

4

Les littéraux entiers sont int s. Le débordement int s. Utilisez le suffixe L.

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

Si les données provenaient de variables cast ou attribuées à des positions longues auparavant. Strictement parlant, vous pouvez vous en sortir avec moins de suffisants, mais il est probablement préférable d'être clair.

Il n'est pas non plus possible de confondre l en tant que suffixe 1.

1

Je suppose que c'est parce que par défaut, java traite les littéraux comme des entiers, pas comme des longs. Donc, sans le L sur 80, la multiplication déborde.

1

Ce code:

long value = 1024 * 1024 * 1024 * 80; 

multiplie certains entiers ensemble, la convertit en une longue et affecte le résultat à une variable. La multiplication réelle sera faite par javac plutôt que quand elle s'exécute.

Puisque int est 32 bits, la valeur est enveloppée et aboutit à un zéro. Comme vous le dites, l'utilisation de valeurs longues dans la partie droite donnera un résultat qui ne s'enroulera que s'il dépasse 64 bits.

1

Si je comprends bien, selon vos besoins, vous vouliez multiplier ces valeurs 1024 * 1024 * 1024 * 80;

calculatrice valeurs que je vois venir 1024 * 1024 * 1024 * 80 = 85899345920.

Ici vous passez votre code Java: Ce sont le calcul de la valeur monétaire 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 
    } 
} 
Questions connexes