1024 * 1024 * 1024 * 1024
và 2147483648
không có cùng giá trị trong Java.
Trên thực tế, 2147483648
KHÔNG NGAY CẢ GIÁ TRỊ (mặc dù 2147483648L
là) trong Java. Trình biên dịch theo nghĩa đen không biết nó là gì hoặc làm thế nào để sử dụng nó. Thế là nó rên rỉ.
1024
là một int hợp lệ trong Java và một giá trị int
nhân với một giá trị khác int
, luôn luôn hợp lệ int
. Ngay cả khi đó không phải là cùng một giá trị mà bạn mong đợi bằng trực giác vì tính toán sẽ tràn.
Thí dụ
Xem xét các mẫu mã sau:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Bạn có mong đợi điều này sẽ tạo ra một lỗi biên dịch không? Bây giờ nó trở nên trơn hơn một chút.
Điều gì xảy ra nếu chúng ta đặt một vòng lặp với 3 lần lặp và nhân trong vòng lặp?
Trình biên dịch được phép tối ưu hóa, nhưng nó không thể thay đổi hành vi của chương trình trong khi nó đang làm như vậy.
Một số thông tin về cách xử lý vụ việc này:
Trong Java và nhiều ngôn ngữ khác, số nguyên sẽ bao gồm một số bit cố định. Các tính toán không phù hợp với số bit đã cho sẽ tràn ra ; phép tính về cơ bản được thực hiện mô đun 2 ^ 32 trong Java, sau đó giá trị được chuyển đổi trở lại thành một số nguyên đã ký .
Các ngôn ngữ hoặc API khác sử dụng số bit động ( BigInteger
trong Java), đưa ra một ngoại lệ hoặc đặt giá trị thành giá trị ma thuật, chẳng hạn như số không.