Câu hỏi đặt ra là:Các nhà điều hành Java vấn đề thú vị
Tại sao trong trường hợp này tôi gặp phải lỗi biên dịch trong Java?
byte x = 0;
x = 128;
Nhưng điều này là hợp pháp:
x+= 999l;
tôi sử dụng nhật thực, jdk 7.
cảm ơn
Câu hỏi đặt ra là:Các nhà điều hành Java vấn đề thú vị
Tại sao trong trường hợp này tôi gặp phải lỗi biên dịch trong Java?
byte x = 0;
x = 128;
Nhưng điều này là hợp pháp:
x+= 999l;
tôi sử dụng nhật thực, jdk 7.
cảm ơn
Trong bạn đầu tiên:
byte x = 0;
x = 128;
Một byte là loại tích phân có dấu, rộng 8 bit và có thể thể hiện phạm vi -128
thành +127
.
x = 128
có nghĩa là "gán x
để 128
", và theo mặc định, 128
là loại int
, vì vậy bạn đang cố gắng để gán một int
để byte
đó sẽ gây ra Possible loss of precision
lỗi, vì int
rộng hơn byte
. Để làm điều này hoạt động, bạn sẽ phải truyền rõ ràng giá trị của 128
.
byte x = 0;
x = (byte)128; // x is now -128.
Ví dụ thứ hai, thêm giá trị vào x
là tốt, nhưng bạn chỉ tràn giá trị.
byte x = 0;
x += 999L; // don't really need the long qualifier here
// x is now -25.
byte
được ký kết và chỉ có thể giữ một giá trị tối đa 127
và một giá trị tối thiểu là -128
, đó là lý do tại sao trường hợp đầu tiên cung cấp cho bạn một lỗi biên dịch.
Trường hợp thứ hai biên dịch vì và giá trị bạn thêm vào một 'byte' kết thúc tốt đẹp xung quanh, thông báo rằng 999 % 128 = 103
, đó là trong phạm vi giá trị của một 'byte'
Nó không thực sự quan trọng số lượng ông đã thêm, bổ sung sẽ không bao giờ thất bại trong việc biên dịch; nó sẽ chỉ tràn - trái ngược với việc cố gắng gán một hằng số biên dịch ngoài phạm vi thời gian. –
@MarkoTopolnik Đúng, cảm ơn –
Điều thú vị, nhưng tại sao? Trong trình biên dịch có thể thấy rằng nó tràn và có thể cấm nó nhưng nó không làm như vậy .. –
Trong tuyên bố đầu tiên này x = 128
, vì phạm vi byte là 0-127
trong java nó đòi hỏi một diễn viên rõ ràng và do đó các lỗi biên dịch. Trong trường hợp thứ hai nó tràn và được chuyển đổi thành -25 trong phạm vi byte.
byte có phạm vi từ -128 đến 127. x + = 999l này; hoạt động vì nó là toán tử gán phức. có một cái nhìn ở đây possible same or alike question.
Chính xác thì bạn đang cố hỏi gì, các khối mã tương ứng không có điểm chung nào ngoài việc có biến x? – sjakubowski
Ông có nghĩa là x là byte là tốt trong trường hợp thứ hai –