Tampaknya ketika Anda mengetikkan angka di Java, kompilator secara otomatis membacanya sebagai integer, itulah sebabnya ketika Anda mengetikkan (long) 6000000000
(bukan dalam range integer) akan mengeluh bahwa 6000000000
itu bukan integer. Untuk memperbaiki ini, saya harus menjelaskan 6000000000L
. Saya baru belajar tentang spesifikasi ini.
Apakah ada spesifikasi angka lain seperti short, byte, float, double? Sepertinya ini bagus untuk dimiliki karena (saya asumsikan) jika Anda dapat menentukan nomor yang Anda ketik pendek maka java tidak perlu membuangnya - itu asumsi, perbaiki saya jika saya salah . Saya biasanya akan mencari pertanyaan ini sendiri, tetapi saya tidak tahu apa nama spesifikasi nomor ini.
1
denganl
dan0
denganO
(dan seterusnya), prioritas Anda adalah mengatur font dengan benar (jika Anda bisa ), lalu khawatir tentang memastikan Anda tidak melewatkan tombol Shift.long _lo = 30;
dan30L
bukankah ini berarti variabel saya akan diubah menjadi float ? Atau dalam kasus_lo = _lo + 2.77
yang_lo
akan dilemparkan ke pelampung meskipun telah dinyatakan lama30
adalahint
yang secara otomatis dikonversi melalui konversi yang melebar menjadilong
. Dalam kasus kedua, pernyataan Anda tidak sah. Anda harus secara eksplisit melemparkan sisi kanan ke long, misalnya_lo = (long) (_lo + 2.77)
l
dan1
(0
danO
resp.) Cukup mirip.Saya harap Anda tidak keberatan sedikit bersinggungan, tetapi Anda mungkin tertarik untuk mengetahui bahwa selain
F
(untuk float),D
(untuk ganda), danL
(untuk jangka waktu lama), sebuah proposal telah dibuat untuk menambahkan sufiks untukbyte
danshort
-Y
danS
masing - masing . Ini akan menghilangkan kebutuhan untuk mentransmisikan ke byte saat menggunakan sintaks literal untuk array byte (atau pendek). Mengutip contoh dari proposal:Joe Darcy mengawasi Project Coin untuk Java 7, dan blognya telah menjadi cara mudah untuk melacak proposal ini.
sumber
0b
awalan untuk literal biner. Teriakan.Secara default, semua tipe data primitif integral (byte, short, int, long) akan diperlakukan sebagai tipe int oleh compiler java. Untuk byte dan short , selama nilai yang ditetapkan untuk mereka berada dalam jangkauannya, tidak ada masalah dan tidak diperlukan sufiks. Jika nilai yang ditetapkan ke byte dan short melebihi kisarannya, diperlukan pengecoran tipe eksplisit.
Ex:
untuk mengatasi hal ini lakukan pengecoran tipe.
Dalam kasus tipe data yang panjang, itu dapat menerima nilai integer tanpa kerumitan apapun. Misalkan kita menetapkan suka
dalam hal ini sufiks seperti L / l tidak diperlukan. Dengan nilai default 2147483647 dianggap oleh compiler java adalah tipe int. Pengecoran tipe internal dilakukan oleh compiler dan int secara otomatis dipromosikan ke tipe Long.
Di sini kita perlu meletakkan sufiks sebagai L untuk memperlakukan literal 2147483648 sebagai tipe panjang oleh compiler java.
jadi akhirnya
sumber
Ini adalah literal dan dijelaskan di bagian 3.10 dari spesifikasi bahasa Java.
sumber
Karena penguraian literal terjadi pada waktu kompilasi, ini sama sekali tidak relevan dalam kaitannya dengan performa. Satu-satunya alasan memiliki
short
danbyte
sufiks akan menyenangkan adalah karena itu mengarah pada kode yang lebih kompak.sumber
Untuk memahami mengapa perlu membedakan antara
int
danlong
literal, pertimbangkan:melawan
Sekarang seperti yang Anda harapkan, kedua fragmen kode memberikan nilai yang sama untuk variabel
l
. Tanpa bisa membedakanint
danlong
literal, apa tafsirnya-1 >>> 1
?atau
Jadi, meskipun angkanya berada dalam kisaran umum, kita perlu menentukan jenisnya. Jika default diubah dengan besaran literal, maka akan ada perubahan aneh dalam interpretasi ekspresi hanya dari mengubah digit.
Ini tidak terjadi untuk
byte
,short
danchar
karena mereka selalu dipromosikan sebelum melakukan operasi aritmatika dan bitwise. Bisa dibilang mereka harus berupa sufiks tipe integer untuk digunakan dalam, katakanlah, ekspresi inisialisasi array, tetapi tidak ada.float
menggunakan sufiksf
dandouble
d
. Literal lain memiliki tipe yang tidak ambigu, dengan adanya tipe khusus untuknull
.sumber
Integer.MAX_VALUE
, namun jika tidak ada cara untuk membedakan antaraint
danlong
literal, itu akan menjadi ambigu. / Saya tidak ingat pertanyaan ini, tetapi saya telah mengklarifikasi jawaban saya.