Tôi đã cố gắng chuyển đổi int và dài này, nơi tôi đã thử gán một biến số int
cho biến số long
. Mã này là như sau:int để phân công dài
public static void main(String []args){
int i = 1024;
long j = i;
long k = i*i*i*i;
System.out.println("j= " +j+ ", k= " +k);
}
Vì vậy, khi in j
, nó chỉ đơn giản đưa ra một sản lượng 1024
. Nhưng trong khi in k
, nó cho thấy một tràn (k
= 0). Tôi đã giải quyết vấn đề này bằng cách sử dụng kỹ thuật này, nơi tôi đã đúc một cách rõ ràng mỗi i
đến long
. ví dụ:
public static void main(String []args){
int i = 1024;
long j = i;
long k = ((long)i)*((long)i)*((long)i)*((long)i);
System.out.println("j= " +j+ ", k= " +k);
}
Bây giờ, nó đã cho thấy giá trị đúng của cả hai j
và k
. Vì vậy, tôi muốn biết lý do tại sao điều này cần thiết để đúc int
trong trường hợp thứ hai nhưng không phải trong trường hợp đầu tiên. k
, là long
có thể giữ lại giá trị này sau lần gán nặng này. Nhưng, tại sao nó không được chỉ định một cách chính xác?
truyền đầu tiên 'i' đến đủ phải đủ –
((dài) i) * i * i * i –
Mẫu bị lỗi mà bạn đã xác định - một phép nhân số nguyên có thể tràn mà được chuyển đổi" quá muộn "đến một loại lớn hơn - tương đối phổ biến ở cả C# và Java; chúng tôi tìm thấy hơn năm trường hợp trên một triệu dòng mã được phân tích. Một khiếm khuyết có liên quan với tỷ lệ khám phá tương tự là một bộ phận của hai số nguyên và một chuyển đổi "quá trễ" thành một đôi; mọi người thường ngạc nhiên rằng ba trăm chia cho năm trăm và được gán cho một đôi là bằng không, không phải 0,6. –