2015-06-27 16 views
5
char c1 = 123; //Compiles fine 
char c2 = 123456; //Error: cannot convert from int to char 

Java là đủ thông minh để xác định xem một số nguyên là đủ nhỏ để được chuyển đổi sang một nhân vật. Tại sao nó không thể chuyển đổi các chữ số dấu chấm động rất nhỏ thành một float ?. Ví dụ:char c = một số chữ số nguyên có thể biên dịch nhưng float f = một số dấu chấm động sẽ không bao giờ biên dịch. Tại sao?

float f1 = 0.3; //Error: cannot convert from double to float 
float f2 = 0.3f; //Compiles fine 

char c = một số nguyên theo nghĩa đen có thể biên dịch nhưng nổi f = một số điểm nổi đen sẽ không bao giờ biên dịch. Tại sao?

PS: Tôi biết rằng một dấu chấm đen được coi là một đôi theo mặc định

+0

thể trùng lặp của [Java: Tại sao bạn cần phải xác định một 'f" trong một phao đen] (http://stackoverflow.com/questions/14102955/java-why-do-you-need- to-specify-af-in-a-float-literal) – RealSkeptic

+0

Câu hỏi của tôi không phải là về 'f' trong các chữ số dấu chấm động. Đó là về cách một kiểu dữ liệu lớn hơn được chuyển đổi thành một kiểu dữ liệu nhỏ hơn mà không có bất kỳ vấn đề nào trong một trường hợp (int đến char, 32 bit đến 16 bit) trong khi nó đưa ra một lỗi biên dịch trong trường hợp khác (double to float, 64 bit đến 32 bit) .Tiếng đủ nhỏ để vừa với biến float giống như int là nhỏ @ RealSkeptic –

+0

Câu trả lời vẫn nằm trong câu hỏi đó - tuy nhiên, câu trả lời hay nhất không phải là câu trả lời được chấp nhận – RealSkeptic

Trả lời

7

0.3 được coi là một đôi, vì vậy biểu diễn nhị phân của nó có 64 bit và nó không thể phù hợp với một phao mà không mất khả năng về độ chính xác, vì vậy bạn không thể gán nó cho một biến nổi mà không có một diễn viên rõ ràng.

Mặt khác, nếu bạn chỉ định cho biến char là chữ cái trong phạm vi loại char (ví dụ 123), sẽ không mất dữ liệu.

Cả hai nhiệm vụ (biến int đến biến char và biến kép thành float) yêu cầu narrowing primitive conversion.

JLS 5.2 nói

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

+3

Tôi sẽ thêm rằng '0.3' không thể được biểu diễn chính xác trong dấu phẩy động nhị phân ith * bất kỳ mức độ chính xác nào. –

+1

Một số nguyên, dù nhỏ, sẽ luôn được biểu thị bằng 32 bit trong khi ký tự được biểu diễn bằng 16 bit. Vì vậy, không phải là một sự mất mát có thể có chính xác ở đây là tốt ?. Cũng giống như trong trường hợp nổi và tăng gấp đôi? –

+1

@PiyushSaravagi Xem báo tôi đã thêm từ JLS. Bất kỳ int giữa 0 và 2^16-1 có thể được gán cho một biến char mà không mất thông tin, vì 16 bit đầu của int sẽ chứa 0 để chúng có thể bị loại bỏ mà không làm mất bất kỳ thông tin nào. – Eran

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