Memahami Percanggahan Nilai Berangka
Dalam coretan kod yang disediakan, percanggahan ketara antara kedua-dua operasi pendaraban berpunca daripada ketiadaan atau kehadiran aksara "L" dilampirkan pada nilai berangka:
long oneYearWithL = 1000*60*60*24*365L; long oneYearWithoutL = 1000*60*60*24*365;
Melampirkan "L" untuk Memastikan Nilai Panjang
Dalam ungkapan pertama, akhiran "L" menandakan literal integer panjang, menunjukkan bahawa nilai itu harus dianggap sebagai integer 64-bit. Hasil pendaraban ini ialah nilai panjang 31536000000 milisaat setahun.
Ketiadaan Keputusan "L" dalam Nilai Integer
Dalam ungkapan kedua, tanpa " L", operasi pendaraban menghasilkan nilai integer. Dalam kes ini, hasilnya ialah 1471228928 apabila nilai jangkaan sepatutnya melebihi 3 bilion milisaat.
Limpahan Integer dan Pemangkasan
Percanggahan berlaku kerana hasil darab empat Integer 32-bit (1000, 60, 60, dan 24) dengan integer 32-bit kelima (365) melebihi julat integer, iaitu [-2^31, 2^31-1]. Hasilnya membungkus, menghasilkan nilai 1471228928 yang salah dalam ungkapan kedua.
Penukaran kepada Perwakilan Pelengkap 2
Jika tiada akhiran "L", jika hasil pendaraban integer adalah negatif dan melebihi julat integer, ia ditukar kepada perwakilan pelengkap 2 sebelum ditugaskan kepada pembolehubah integer. Penukaran ini memastikan bahawa nilai negatif boleh diwakili dalam julat integer.
Memastikan Keputusan yang Betul
Untuk mendapatkan hasil yang betul, adalah penting untuk mengisytiharkan nilai berangka yang melebihi julat integer sebagai nilai panjang dengan menambahkan "L" untuk memastikan perwakilan yang betul dan mengelakkan pemotongan atau penukaran kepada perwakilan pelengkap 2.
Atas ialah kandungan terperinci Mengapa menambahkan 'L' pada nilai berangka di Jawa secara drastik mengubah hasil operasi pendaraban?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!