2017-06-16 14 views
6

Dlaczego nie piszemy s z krótkim typem danych, jak short s = 2s;, gdy piszemy z float np. float f = 1.23f?Dlaczego nie dodamy sufiksu "s" do krótkich typów?

wiem kiedy piszemy float domyślnie kompilator traktuje ją jako double i przydziela 8 bajtów tymczasowych do niego, a gdy próbuje skopiować że 8 bajtów do float „s 4, który powoduje błąd typu, więc jest to dlaczego piszemy f po inicjalizacji float, ale dlaczego nie robimy czegoś podobnego z short, ponieważ domyślnie int jest literałem?

Odpowiedz

1

Dzieje się tak dlatego, że przechodzenie z podwójnego do zmiennoprzecinkowego powoduje obcięcie wartości i utratę danych, więc kompilator nie robi tego automatycznie, trzeba to wyraźnie powiedzieć. Ale kiedy przechodzimy od mniejszego rozmiaru, krótkiego, do większego rozmiaru, int, robi się to automatycznie, ponieważ kompilator musi tylko podkładać dane i nie ma potencjalnej utraty danych, w przeciwieństwie do poprzedniego przypadku.

+1

również przechodzimy od int do short, ponieważ domyślnie int literał jest standardem Myślę, że – PVP

+0

Jednak krótką zmienną można przypisać do literału int. Na przykład "short s = 32767". To przechodzi od typu większego rozmiaru do typu o mniejszym rozmiarze. Wydaje się, że kompilator patrzy na rzeczywistą wartość int strony prawej, ponieważ 'short t = 32768' nie jest akceptowane. –

+0

@AndyThomas ah, nie widziałem go w aplikacji. –

4

Specyfikacja języka Java zezwala na przyrostek typu L lub l dla długich literałów. Jednak nie zapewnia sufiksu typu dla krótkich wartości. Nie jest to konieczne, ponieważ:

  • Każda wartość, która może być reprezentowana przez skrót, może być również reprezentowana przez domyślny typ całkowania int.
  • Przypisania wartości int do krótkiej zmiennej są dozwolone, jeśli wartość to constant expression, której wartość może być reprezentowana przez skrót. Zobacz Java Language Specification, "Assignment Contexts":

zwężenie prymitywna konwersja może być stosowane, jeżeli typ zmiennej jest bajt, krótkie, lub char, a wartość stałej ekspresji jest reprezentowalna w rodzaju zmiennej.

+0

Thomus sir to również dowolna wartość, która może być reprezentowana przez float może być również reprezentowana przez domyślny typ double ?. – PVP

+2

@PVP zobacz https://stackoverflow.com/a/14103012/3788176 –

0

Dlaczego nie dodamy sufiksu "s" do krótkich typów?

Ponieważ język Java jest niespójny w tym punkcie.

JLS jest bardziej elastyczny, nie pływające numerycznych typów pierwotnych jak pływające numeryczne typy pierwotne:

Ponadto, jeśli ekspresja ma stałą wyrażenie (§15.28) od bajtu typu , short, char, lub int:

Zwężająca się konwersja pierwotna może być użyta, jeśli typ zmiennej to bajt, skrót lub znak, a wartość stałej wyrażenie można reprezentować w typie zmiennej.

myślę, że robi rozróżnienie między byte, short, char, or int i float and double na przeszkodzie uznaniu i manipulować nimi nie było naprawdę konieczne. Powoduje to niespójność i potencjalne błędy w ich wykorzystaniu.

jeśli short s = 10; jest poprawny, ponieważ zwężająca się prymitywna konwersja jest sprawdzana przez kompilator, że nie ma utraconych informacji, więc float f = 10.0; również byłby ważny z dokładnie tego samego powodu.

Powiązane problemy