Java ' S L number (long) specification

Wygląda na to, że Gdy wpiszesz liczbę w Javie, kompilator automatycznie odczytuje ją jako liczbę całkowitą, dlatego gdy wpiszesz (long) 6000000000 (nie w zakresie liczby całkowitej) będzie narzekał, że 6000000000 nie jest liczbą całkowitą. Aby to poprawić, musiałem podać 6000000000L. Właśnie dowiedziałem się o tej specyfikacji.

Czy istnieją inne specyfikacje liczb, takie jak short, byte, float, double? Wygląda na to, że dobrze byłoby je mieć, ponieważ (zakładam) jeśli można by określić numer, który wpisujesz jest krótki to java nie musiałaby go rzucać - to założenie, popraw mnie jeśli się mylę. Normalnie Sam bym to pytanie przeszukiwał, ale nie wiem jak się w ogóle nazywa taka Specyfikacja liczbowa.

Author: azro, 2009-04-20

6 answers

Istnieją specyficzne przyrostki dla long (np. 39832L), float (np. 2.4f) i double (np. -7.832d).

Jeśli nie ma sufiksu, a jest typem całkowym (np. 5623), przyjmuje się, że jest to int. Jeśli nie jest typem całkowym (np. 3.14159), przyjmuje się, że jest to double.

We wszystkich innych przypadkach (byte, short, char), potrzebujesz obsady, ponieważ nie ma określonego przyrostka.

Specyfikacja Java pozwala zarówno na duże, jak i małe litery, ale wersja z dużymi literami dla long s jest preferowany, ponieważ małe litery L łatwiej pomylić z cyfrą 1 niż małe litery l.

Zobacz JLS sekcja 3.10 aby uzyskać szczegółowe informacje(Zobacz definicję IntegerTypeSuffix).

 179
Author: Simon Nickerson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-17 15:18:42

Mam nadzieję, że nie będziesz miał nic przeciwko drobnej stycznej, ale pomyślałem, że możesz być zainteresowany, aby wiedzieć, że oprócz F (dla float), D (dla double) i L (dla long), zaproponowano dodanie przyrostków dla byte i short-Y i S odpowiednio. Eliminowałoby to konieczność rzucania na bajty przy użyciu dosłownej składni dla bajtowych (lub krótkich) tablic. Cytując przykład z propozycji:

Główna korzyść: dlaczego Platforma lepiej, jeśli wniosek jest adoptowany?

Cruddy code like

 byte[] stuff = { 0x00, 0x7F, (byte)0x80,  (byte)0xFF};

Może być przekodowany jako

 byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };

Joe Darcy nadzoruje projekt Coin dla Javy 7, i jego blog był łatwym sposobem na śledzenie tych propozycji.

 13
Author: erickson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-16 07:30:44

Domyślnie każdy integralny prymitywny typ danych (byte, short, int, long) będzie traktowany przez kompilator Javy jako typ int. Dla byte i short , o ile przypisana im wartość znajduje się w ich zakresie, nie ma problemu i nie jest wymagany przyrostek. Jeśli wartość przypisana do byte ishort przekracza ich zakres, wymagane jest jawne odlewanie typu.

Ex:

byte b = 130; // CE: range is exceeding.

Aby przezwyciężyć ten rodzaj odlewania.

byte b = (byte)130; //valid, but chances of losing data is there.

W przypadku długich danych Typ, może przyjąć wartość całkowitą bez żadnych kłopotów. Załóżmy, że przypisujemy jak

Long l = 2147483647; //which is max value of int

W tym przypadku nie jest wymagany przyrostek L/L. Domyślnie wartość 2147483647 jest traktowana przez kompilator Javy jako typ int. Wewnętrzne odlewanie typu jest wykonywane przez kompilator, a int jest automatycznie promowany do typu Long.

Long l = 2147483648; //CE: value is treated as int but out of range 

Tutaj musimy umieścić sufiks jako L, aby traktować dosłowne 2147483648 jako długi typ przez kompilator Javy.

Więc w końcu

Long l = 2147483648L;// works fine.
 13
Author: Utpal Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-18 13:22:47

Są to literały i są opisane w sekcja 3.10 specyfikacji języka Java.

 9
Author: McDowell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-28 09:05:19

Wydaje się, że to byłoby dobre dla mieć, bo (zakładam) jeśli można podaj numer, który wpisujesz to krótki wtedy java nie musiałaby cast it

Ponieważ parsowanie liter odbywa się w czasie kompilacji, jest to absolutnie nieistotne w odniesieniu do wydajności. Jedynym powodem posiadania przyrostków short i byte byłoby to, że prowadzą one do bardziej zwartego kodu.

 1
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-21 08:17:27

Aby zrozumieć, dlaczego konieczne jest rozróżnienie liter int i long, rozważ:

long l = -1 >>> 1;

Kontra

int a = -1;
long l = a >>> 1;

Teraz, jak można się spodziewać, oba fragmenty kodu dają tę samą wartość zmiennej l. Nie będąc w stanie odróżnić liter int i long, Jaka jest interpretacja -1 >>> 1?

-1L >>> 1 // ?

Lub

(int)-1 >>> 1 // ?

Więc nawet jeśli liczba jest w powszechnym zakresie, musimy określić typ. Jeśli wartość domyślna zmieniła się z wielkością dosłowne, wtedy byłaby dziwna zmiana w interpretacjach wyrażeń po prostu od zmiany cyfr.

Nie występuje to dla byte, short i char ponieważ są one zawsze promowane przed wykonaniem operacji arytmetycznych i bitowych. Prawdopodobnie powinny być przyrostkami typu integer do użycia w, powiedzmy, wyrażeniach inicjujących tablicę, ale tak nie jest. float używa przyrostka f i double d. Inne literały mają jednoznaczne typy, przy czym istnieje specjalny typ dla null.

 0
Author: Tom Hawtin - tackline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-24 16:00:47