2016-03-25 17 views
12
System.out.println((byte) (1.0/0)); 
    System.out.println((short) (1.0/0)); 
    System.out.println((int) (1.0/0)); 
    System.out.println((long) (1.0/0)); 

Wynikiem jest:Dlaczego podział na odlewy przez zero na liczby całkowite w liczbach całkowitych daje różne wyniki?

-1 
    -1 
    2147483647 
    9223372036854775807 

w formacie binarnym:

1111 1111 
    1111 1111 1111 1111 
    0111 1111 1111 1111 1111 1111 1111 1111 
    0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 

Dlaczego odlewania nieskończoność na int i długie liczby całkowite utrzymuje bit znaku jako "0", natomiast zestawy bit znaku „1 "dla bajtów i krótkich liczb całkowitych?

+3

Zakładam, że rzutuje na 'int', a następnie na' bajt' Uwaga: Integer.MAX_VALUE jest najbliższą wartości Infinity dla 'int'. –

+0

Thx Peter, ale rzucanie Integer.MAX_VALUE na "long" dałoby nam tylko "2147483647L", mam rację? –

+0

@PeterLawrey Czy nie byłoby możliwe, aby '(1.0/0)' było ocenione jako 'podwójne', a następnie kasta do bajtu rozważa dolne 8 bitów? Podczas gdy IEEE 754 definiuje standard dla 'double' i' float', uważam za dziwne, że bit znaku wynosi 0 dla 'int', ponieważ dokumenty nie definiują specyfikacji nieskończoności dla' int'. –

Odpowiedz

10

JLS 5.1.3:

Konwersja zwężenie szeregu zmiennoprzecinkową integralną typu T wykonuje dwa etapy:

W pierwszym etapie, ilość zmiennoprzecinkową przekształca się albo do długo , jeśli T jest długi, lub do int, jeśli T jest bajt, krótki, char lub int, w następujący sposób:

Jeśli liczba zmiennoprzecinkowa jest NaN (§ 4.2.3), wynik najpierw krok konw sion jest całkowitoliczbową 0.

W przeciwnym razie, jeżeli liczba zmiennoprzecinkowy nie jest nieskończona wartość zmiennoprzecinkową zaokrągla się liczbą całkowitą V zaokrąglenia kierunku zera stosując IEEE 754 okrągłego toward- tryb zerowy (§ 4.2.3). Następnie są dwa przypadki:

Jeżeli T jest długa i to liczba całkowita może być przedstawiony jako długi, to wynik pierwszego etapu jest długi wartość V.

W przeciwnym razie, jeżeli liczba całkowita wartość ta może być przedstawiona jako int następnie wynikiem pierwszego etapu int wartość V.

przeciwnym przypadku, jeden z dwóch następujących przypadkach muszą być spełnione:

wartość powinna być zbyt mała (a wartość ujemna dużej wielkości lub ujemna nieskończoność), a wynikiem pierwszego kroku jest najmniejsza reprezentowalna wartość typu int lub long.

wartość powinna być zbyt duża (wartość dodatnia dużej wielkości lub dodatniej nieskończoności), a wynik pierwszego etapu jest największa zakodowania wartości typu całkowitoliczbowej.

W drugim kroku:

Jeżeli T jest całkowitoliczbową wynik konwersji jest wynikiem pierwszym etapie.

Jeżeli T jest bajt char lub zwarcie wynik konwersji jest wynikiem konwersji zwężającym się do typu T (§5.1.3) w wyniku pierwszym etapie.

więc nieskończona podwójna wartość jest pierwsza obsada do int wracając Integer.MAX_VALUE i następnie jest ponadto obsada do byte/short, która odbywa się odpowiednią liczbę niskich bajtów (i dostaje -1 w wyniku). Rzuca do int i long nie mają ten dodatkowy krok, ale byte i short iść pierwszy przez int i następnie do byte/short.

+0

Chciałem także odnieść się do zwężenia Pierwotnej Konwersji! +1 –

Powiązane problemy