Saya sedang mengerjakan tipe data saat ini di Java, dan jika saya telah memahami dengan benar tipe tersebut long
menerima nilai antara kisaran -9.223.372.036.854.775.808 hingga +9.223.372.036.854.775.807. Sekarang seperti yang Anda lihat di bawah, saya telah membuat long
variabel bernama testLong
, meskipun ketika saya memasukkan 9223372036854775807 sebagai nilainya, saya mendapatkan kesalahan yang menyatakan:
Literal 9223372036854775807 dari tipe int berada di luar jangkauan.
Saya tidak tahu mengapa ini mengacu pada long
tipe data sebagai file int
.
Ada yang punya ide?
Kode:
char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;
java
int
long-integer
Mathew Donnan
sumber
sumber
Jawaban:
Tambahkan modal
L
sampai akhir:long value = 9223372036854775807L;
Jika tidak, kompilator akan mencoba mengurai literal sebagai sebuah
int
, karenanya muncul pesan kesalahansumber
8
atau9
. Hapus angka nol di depan.Bukan itu. Anda harus belajar memercayai pesan kompilator (terutama jika pesan tersebut berasal dari kompiler modern yang waras dan bukan dari kompiler C / C ++ kuno). Meskipun bahasa yang mereka gunakan terkadang sulit diartikan, mereka biasanya tidak berbohong kepada Anda.
Mari kita lihat lagi:
Perhatikan, itu tidak menyebutkan variabel Anda
testLong
atau jenisnya dilong
mana pun, jadi ini bukan tentang inisialisasi. Masalahnya tampaknya terjadi di beberapa titik lain.Sekarang mari kita selidiki beberapa bagian dari pesan tersebut:
int
memberi tahu kami bahwa dia ingin memperlakukan sesuatu sebagaiint
nilai (yang bukan yang Anda inginkan!)int
)Saya akan meninggalkan daftar nyaman untuk membicarakan literal sejenak: literal adalah tempat di mana Anda memiliki nilai dalam kode Anda. Ada
String
literal,int
literal,class
literal dan sebagainya. Setiap kali Anda menyebutkan nilai secara eksplisit dalam kode Anda, itu literal.Jadi sebenarnya ini tidak mengganggu Anda tentang deklarasi variabel, tetapi nomor itu sendiri, nilainya adalah apa yang mengganggu Anda.
Anda dapat dengan mudah memverifikasi ini dengan menggunakan literal yang sama dalam konteks di mana a
long
dan anint
sama-sama dapat diterima:System.out.println(9223372036854775807);
PrintStream.println
dapat mengambil salah satuint
atau along
(atau yang lainnya). Jadi kode itu seharusnya baik-baik saja, bukan?No Yah, mungkin itu harus menjadi, tetapi menurut aturan itu adalah tidak baik.
Masalahnya adalah bahwa "beberapa digit" didefinisikan sebagai
int
literal dan oleh karena itu harus berada dalam kisaran yang ditentukan olehint
.Jika Anda ingin menulis
long
literal, maka Anda harus membuatnya eksplisit dengan menambahkanL
(atau huruf kecill
, tapi saya sangat menyarankan Anda selalu menggunakan varian huruf besar, karena jauh lebih mudah dibaca dan lebih sulit untuk salah untuk a1
).Perhatikan bahwa masalah serupa terjadi dengan
float
(postfixF
/f
) dandouble
(postfixD
/d
).Catatan samping: Anda akan menyadari bahwa tidak ada
byte
ataushort
literal dan Anda masih dapat menetapkan nilai (biasanyaint
literal) ke variabelbyte
danshort
: hal itu dimungkinkan karena aturan khusus di § 5.2 tentang Assignment Converson : mereka mengizinkan penetapan ekspresi konstan dari tipe yang lebih besar untukbyte
,short
,char
atauint
jika nilai-nilai dalam jenis berkisar.sumber
Coba lakukan
9223372036854775807L
. DiL
bagian akhir memberitahu Java bahwa9223372036854775807
adalah along
.sumber
Saya memiliki masalah ini di masa lalu dan saya memperbaikinya dengan menuliskan nilai dalam bentuk ilmiah. sebagai contoh:
double val = 9e300;
sumber
long ak = 34778754226788444L/l;
Keduanya menggunakan tetapi pada satu waktu hanya satu menggunakan huruf besar L atau huruf kecil l.
Mengapa menggunakan L / l? Karena panjang adalah bagian dari tipe data integral.
sumber