2015-08-27 20 views
6

Với đoạn mã sau:Java ngầm chuyển đổi

Float a = 1.2; 

có lỗi bởi vì nó lấy số thập phân giá trị đôi và double là một kiểu dữ liệu lớn hơn float.

Hiện tại, số nguyên này là số nguyên theo mặc định int loại. Vì vậy, tại sao mã sau đây không đưa ra bất kỳ lỗi nào?

Byte b = 20; 
+0

Tôi không biết tại sao bạn không hiểu câu hỏi của tôi ..... bạn nói rằng trình biên dịch đủ thông minh để đưa 20 vào byte .... thì tại sao trình biên dịch không đưa 1,2 vào float .... các ques đơn giản của tôi là ... tôi đọc rằng trong java tất cả thập phân được coi là gấp đôi trong khi tất cả các số nguyên được coi là int theo mặc định ...... sau đó khi im gán 20 đến một byte tại sao nó không đưa ra bất kỳ lỗi nào ... –

Trả lời

7

Trình biên dịch là đủ thông minh để hình dung ra rằng các đại diện chút 20 (một giá trị int) có thể phù hợp với một byte với không mất dữ liệu. Từ Java Language Specification §5.1.3:

Chuyển đổi nguyên thủy thu hẹp từ double để float được điều chỉnh bởi IEEE 754 quy tắc làm tròn (§4.2.4). Chuyển đổi này có thể mất độ chính xác, nhưng cũng mất phạm vi, dẫn đến một số float bằng 0 từ số doublefloat vô cùng từ một số hữu hạn kép. A double NaN được chuyển đổi thành float NaN và double vô cực được chuyển đổi thành float vô cùng giống nhau.

Một chuyển đổi thu hẹp của một số nguyên thành một kiểu tách rời T đơn giản loại bỏ tất cả trừ các bit thứ tự thấp nhất, trong đó n là số bit được sử dụng để biểu diễn loại T. Ngoài khả năng mất thông tin về độ lớn của giá trị số, điều này có thể khiến dấu của giá trị kết quả khác với dấu của giá trị đầu vào.

Xem thêm this thread.

+0

bit đại diện của 200 cũng phù hợp với 8 bit của byte mà không mất dữ liệu. Điều quan trọng là giá trị số giống nhau có thể được thể hiện trong loại mục tiêu. – Joni

+0

@Joni - Vâng, vâng và không. Bởi vì các giá trị 'byte' được ký bằng Java," phù hợp với "thực sự có nghĩa là" vừa với 7 bit ", không phải 8 bit. Mẫu bit 200 là '1100 1000'. Khi điều này được đưa vào một giá trị 'byte' 8 bit, nó đại diện cho giá trị -56, không phải là giá trị 200. Đó là bởi vì biểu diễn của 200 tràn vào bit dấu của một' byte'. Bạn hoàn toàn đúng về điều quan trọng là đại diện của cùng một giá trị. –

1

Không có chuyển đổi hẹp ngầm nói chung - biểu thức hằng số là ngoại lệ duy nhất, và họ được phép một cách rõ ràng bởi JLS 5.2:

Bên cạnh đó, nếu biểu thức là một biểu thức hằng số (§15.28) của loại byte, ngắn, char hoặc int:

* Chuyển đổi nguyên thủy thu hẹp có thể được sử dụng nếu loại biến là byte, ngắn hoặc char và giá trị của biểu thức hằng số được thể hiện trong loại của biến.

Không có đề cập đến các chuyển đổi thu hẹp tiềm ẩn được phép cho số điểm động, vì vậy chúng bị cấm theo quy tắc chung.

+0

+1 để trích dẫn một phần của thông số chỉ định tại sao 'float' /' double' hoạt động khác với 'byte' /' int'. (Bên cạnh việc thu hẹp, mất thông tin trong ví dụ cụ thể của OP, bởi vì 1.2 không thể đại diện chính xác trong dấu phẩy động. Tuy nhiên, trình biên dịch sẽ phàn nàn ngay cả khi giá trị là 1.0 hoặc một cái gì đó khác chính xác là 'float'.) –

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