Wygląda na to, że po wpisaniu liczby w Javie kompilator automatycznie odczytuje ją jako liczbę całkowitą, dlatego po wpisaniu (long) 6000000000
(nie w zakresie całkowitoliczbowym) będzie narzekać, że 6000000000
nie jest liczbą całkowitą. Aby to poprawić, musiałem określić 6000000000L
. Właśnie dowiedziałem się o tej specyfikacji.
Czy istnieją inne specyfikacje liczbowe, takie jak short, byte, float, double? Wygląda na to, że dobrze byłoby je mieć, ponieważ (zakładam), gdybyś mógł określić numer, który wpisujesz, jest krótki, to java nie musiałby go przesyłać - to założenie, popraw mnie, jeśli się mylę . Zwykle sam bym przeszukał to pytanie, ale nie wiem, jak nazywa się tego rodzaju specyfikacja liczb.
1
zl
i0
zO
(i tak dalej), twój priorytetem jest ustalenie właściwej czcionki (jeśli potrafisz ), a następnie upewnij się, że nie przegapisz klawisza Shift.long _lo = 30;
i30L
czy nie oznacza to, że moja zmienna zostanie przekonwertowana na zmiennoprzecinkową ? Lub w przypadku_lo = _lo + 2.77
, że_lo
będą rzutować na pływaka mimo że został uznany za długo30
jest to,int
który jest automatycznie konwertowany poprzez konwersję poszerzającą dolong
. W drugim przypadku Twoje oświadczenie jest niezgodne z prawem. Musiałbyś wyraźnie rzucić prawą stronę za długą, np._lo = (long) (_lo + 2.77)
l
i1
(0
iO
odpowiednio) są dość podobne.Mam nadzieję, że nie będzie miał nic przeciwko niewielki stycznie, ale pomyślałem może być zainteresowany, aby wiedzieć, że oprócz
F
(dla pływaka),D
(za podwójne), iL
(na długo), wniosek został złożony , aby dodać do przyrostkówbyte
ishort
-Y
iS
odpowiednio . To wyeliminowałoby potrzebę rzutowania na bajty przy używaniu składni literału dla tablic bajtowych (lub krótkich). Cytując przykład z propozycji:Joe Darcy nadzoruje Project Coin dla Java 7, a jego blog jest łatwym sposobem na śledzenie tych propozycji.
źródło
0b
przedrostek dla literałów binarnych. Wydać okrzyk radości.Domyślnie każdy integralny pierwotny typ danych (bajt, krótki, int, długi) będzie traktowany jako typ int przez kompilator java. Dla bajt i zwarcia , o ile przypisana im wartość mieści się w ich zakresie, nie ma problemu i nie jest wymagany przyrostek. Jeśli wartość przypisana do bajtu i skrótu przekracza ich zakres, wymagane jest rzutowanie typu jawnego.
Dawny:
byte b = 130; // CE: range is exceeding.
aby przezwyciężyć rzucanie tego typu performansu.
byte b = (byte)130; //valid, but chances of losing data is there.
W przypadku długich typów danych może bez problemu przyjąć wartość całkowitą. Załóżmy, że przypiszemy coś podobnego
Long l = 2147483647; //which is max value of int
w tym przypadku nie jest wymagany przyrostek, taki jak L / l. Domyślnie wartość 2147483647 jest uważana przez kompilator java za typ int. Rzutowanie typu wewnętrznego 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ć przyrostek jako L, aby traktować literał 2147483648 jako długi typ przez kompilator java.
więc w końcu
Long l = 2147483648L;// works fine.
źródło
Są to literały i zostały opisane w sekcji 3.10 specyfikacji języka Java.
źródło
Ponieważ parsowanie literałów odbywa się w czasie kompilacji, nie ma to absolutnie żadnego znaczenia w odniesieniu do wydajności. Jedynym powodem, dla którego posiadanie
short
ibyte
przyrostków byłoby fajne jest to, że prowadzi to do bardziej zwartego kodu.źródło
Aby zrozumieć, dlaczego konieczne jest rozróżnienie między literami
int
along
literałami, rozważ:long l = -1 >>> 1;
przeciw
int a = -1; long l = a >>> 1;
Jak można się słusznie spodziewać, oba fragmenty kodu nadają zmiennej tę samą wartość
l
. Nie będąc w stanie rozróżniaćint
ilong
dosłownie, jaka jest interpretacja-1 >>> 1
?-1L >>> 1 // ?
lub
(int)-1 >>> 1 // ?
Więc nawet jeśli liczba należy do wspólnego zakresu, musimy określić typ. Gdyby wartość domyślna zmieniła się wraz z wielkością literału, nastąpiłaby dziwna zmiana w interpretacji wyrażeń tylko po zmianie cyfr.
To nie wystąpić
byte
,short
achar
ponieważ są one zawsze promowane przed wykonaniem operacji arytmetycznych i bitowe. Prawdopodobnie powinny to być sufiksy typu całkowitego do użycia, powiedzmy, w wyrażeniach inicjujących tablice, ale tak nie jest.float
używa przyrostkaf
idouble
d
. Inne literały mają jednoznaczne typy, przy czym istnieje specjalny typ dlanull
.źródło
Integer.MAX_VALUE
, ale gdyby nie było sposobu na rozróżnienie między literamiint
along
literałami, byłoby to niejednoznaczne. / Nie pamiętam tego pytania, ale i tak wyjaśniłem swoją odpowiedź.