2013-03-05 10 views
10

Jak stwierdza z wyroczniJava Dlaczego konwertuje długie rozszerzenie (64) na zmienne (32)?

referencyjny odOracle Docs

Poszerzenie Primitive Konwersja 19 konkretne konwersje na prymitywnych typów nazywane są poszerzeniem prymitywne konwersji:

  1. bajt do krótkiej, int , długi, zmienny lub podwójny
  2. krótki do int, długi, zmienny lub podwójny
  3. char na int, long, pływak, lub podwójne
  4. int do długiej, float lub podwójne
  5. długo unosić lub podwójne?
  6. pływak podwoić

Jeśli pływak ma 32 bitów i długi ma 64, jak jest to uważane za rozszerzenie? Czy nie powinno się tego uważać za zwężające?

+0

Myślę, że jest to związane z precyzją. Mogę tylko o tym pomyśleć :) – kaysush

+0

Powiedziałeś "* Jeśli długi ma 32 bity, a długie ma 64 *" ... wymyśl swoje zdanie – Bohemian

+0

Nie zrozumiałem twojego pytania: Jeśli długo ma 32 bity i długo ma 64, jak to jest uważane za rozszerzenie? Czy nie powinno się tego uważać za zwężające? Długi typ danych to 64-bitowa liczba całkowita z dopełnieniem z podpisem w języku java. proszę zapoznać się z następującym linkiem: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – Gourabp

Odpowiedz

18

Zakres wartości, które mogą być reprezentowane przez float lub double jest znacznie większy niż zakres, który może być reprezentowany przez long. Chociaż podczas konwersji z long do jednej z nich można przekonwertować wartość z long, nadal jest to operacja "poszerzania", ponieważ zakres jest szerszy.

Z Java Language Specification, §5.1.2:

poszerzenie konwersja int lub długiej wartości float lub długiego wartości podwoić, może doprowadzić do utraty precyzji - to znaczy, że wynik może stracić część najmniej znaczących bitów wartości. W takim przypadku wynikowa wartość zmiennoprzecinkowa będzie poprawnie zaokrągloną wersją wartości całkowitej, za pomocą trybu IEEE 754 round-to-nearest (§ 4.2.4).

Należy pamiętać, że double może dokładnie reprezentować każdą możliwą wartość int.

+2

@ Mrshll187 - W rzeczywistości "float" ma 32 bity, z czego 8 to wykładnik. Dostępne są tylko 24 bity do reprezentowania mantysy. Nie wiem, co by znaczyło "Mogę być do 64 bitów". Pływak może reprezentować niektóre liczby w zakresie od 1,40129846432481707e-45 do 3,40282346638528860e + 38 (a także kilka specjalnych wartości, takich jak NaN i ± nieskończoność). "Long" może reprezentować wszystkie liczby w zakresie -22 223 372 036 854 775 808 do + 2223372 036 854 775 807. Możesz myśleć o nazwach każdego typu jako o nazwie podzbioru liczb. Podzbiory nakładają się, ale każdy podzbiór ma elementy inne niż pozostałe. –

+0

Dziękuję Ted! Miałem bardzo trudny czas, żeby to uchwycić, tak jak myślałem w kategoriach bitów. –

2

Rozważa się rozszerzenie, ponieważ float i double mogą reprezentować większe wartości niż long. Możesz stracić precyzję, ale będzie możliwe przedstawienie wartości (przynajmniej w przybliżeniu).

2

Rozważa się rozszerzenie, ponieważ liczby, które mogą być reprezentowane przez liczbę zmiennoprzecinkową, są większe niż liczby, które można przedstawić długością. Tylko dlatego, że float wykorzystuje 32-bitową precyzję, nie oznacza, że ​​liczby, które może reprezentować, są ograniczone do 2^32.

Na przykład pływak (float)Long.MAX_VALUE+(float)Long.MAX_VALUE jest większy niż Long.MAX_VALUE, mimo że pływak ma mniejszą dokładność niż długa.