2012-05-14 33 views
6

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

+0

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

+1

Ông có nghĩa là x là byte là tốt trong trường hợp thứ hai –

Trả lời

2

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. 
4

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'

+0

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. –

+0

@MarkoTopolnik Đúng, cảm ơn –

+0

Đ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 .. –

0

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.

Các vấn đề liên quan