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

wyjściowa wynosi:Pomnożenie długich wartości?

 
9223372036854775807 
0 

Jest to poprawne, jeśli long value = 1024 * 1024 * 1024 * 80L;!

Odpowiedz

35

W Javie cała matematyka jest wykonywana w największym typie danych wymaganym do obsługi wszystkich bieżących wartości. Tak więc, jeśli masz int * int, zawsze będzie matematyka jako liczba całkowita, ale int * long jest wykonywana jako długa.

W tym przypadku 1024 * 1024 * 1024 * 80 jest wykonywane jako wartość Int, która przepełnia int.

"L" oczywiście zmusza jeden z operandów do użycia Int-64 (long), dlatego też cała matematyka zapisuje wartości jako Long, więc nie występuje nadmiar.

+3

arytmetyczna na, powiedzmy, 'short's nie odbywa jak' short's, jak to się robi 'int's . –

+0

Tom: To bardzo interesujące, nigdy bym tego nie wiedział. Właśnie przetestowałem to z dwoma szortami (w C#, ale podobną akcją), i to Zrobiło matematykę jako Integer ... To musi być po prostu użycie Int jako wartości domyślnej dla zwykłych typów numerycznych. – Erich

+0

tj. krótki x = 0; krótki y = 0; x = x + y; podaje błąd niedopasowania typu. – pmu

4

Liczby całkowite to int s. Przepełnienie int. Użyj przyrostka L.

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

Jeśli dane pochodzą ze zmiennych, należy je odrzucić lub przypisać do longów.

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

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

Ściśle mówiąc, można uzyskać mniejszą ilość wystarczającą, ale prawdopodobnie lepiej jest zachować jasność.

Również mała litera l jako sufiks może być mylona jako 1.

1

Podejrzewam, że to dlatego, że java domyślnie traktuje literały jako liczby całkowite, a nie długie. Zatem bez L na 80 mnożenie się przepełnia.

1

ten kod:

long value = 1024 * 1024 * 1024 * 80; 

mnoży pewne liczby całkowite razem, zamienia go na długo, a następnie przypisuje wynik do zmiennej. Właściwe mnożenie będzie wykonywane przez javac, a nie wtedy, gdy zostanie uruchomione.

Ponieważ int ma wartość 32 bitów, wartość jest zawijana i daje zero.

Tak jak mówisz, użycie długich wartości po prawej stronie da wynik, który zawija tylko, jeśli przekracza 64 bity.

1

Jeśli Rozumiałem go prawidłowo, na swoje wymagania, chcesz pomnożyć te wartości 1024 * 1024 * 1024 * 80;

W kalkulatorze widzę wartości pochodzących 1024 * 1024 * 1024 * 80 = 85899345920.

Tutaj można przejść swój kod Java: Są to obliczanie wartości pieniężnej w 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 
    } 
} 
Powiązane problemy