1024 * 1024 * 1024 * 1024
dan 2147483648
tidak memiliki nilai yang sama di Jawa.
Sebenarnya, 2147483648
BUKAN BAHKAN NILAI (walaupun 2147483648L
) di Jawa. Kompiler benar-benar tidak tahu apa itu, atau bagaimana menggunakannya. Jadi itu merengek.
1024
adalah int yang valid di Java, dan valid int
dikalikan dengan valid lain int
, selalu valid int
. Bahkan jika itu bukan nilai yang sama yang Anda harapkan secara intuitif karena perhitungannya akan meluap.
Contoh
Pertimbangkan contoh kode berikut:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Apakah Anda berharap ini menghasilkan kesalahan kompilasi? Itu menjadi sedikit lebih licin sekarang.
Bagaimana jika kita meletakkan satu loop dengan 3 iterasi dan dikalikan dalam loop?
Kompiler diizinkan untuk mengoptimalkan, tetapi tidak dapat mengubah perilaku program saat melakukannya.
Beberapa info tentang bagaimana kasus ini ditangani:
Di Jawa dan banyak bahasa lainnya, integer akan terdiri dari jumlah bit yang tetap. Perhitungan yang tidak sesuai dengan jumlah bit yang diberikan akan melimpah ; perhitungan pada dasarnya dilakukan modulus 2 ^ 32 di Jawa, setelah itu nilai diubah kembali menjadi bilangan bulat yang ditandatangani .
Bahasa atau API lain menggunakan jumlah bit dinamis ( BigInteger
di Jawa), naikkan pengecualian atau setel nilai ke nilai ajaib seperti bukan-angka-.