2017-03-10 33 views
38

Tôi đang nghiên cứu chứng nhận java. Và tôi tò mò về các chữ java. Tôi biết nó có thể làm điều gì đó như thế này:Cơ số thập lục phân Java double literal

int i = 0xAA; 
long l = 0xAAL; 

Ngoài ra đây là có thể cho biến dấu chấm động:

double d = 123d; 
float f = 123f; 

Vì vậy, tôi một cách logic nghĩ với những ví dụ mà giống nhau sẽ được áp dụng cho hệ thập lục phân . Cũng giống như tôi có thể thêm L cho các ký tự dài, tôi có thể thêm 'd' hoặc 'f' nhưng logic là thiếu sót vì 'F' và 'D' là các giá trị thập lục phân hợp lệ.

Nó không thể làm điều gì đó như thế này:

double d = 0xAAAAAAAAAAAAAAAAAAd; 

Đây có phải là chỉ không được phép bởi Java hoặc có một cách đơn giản để làm điều đó mà tôi không biết?

+0

Bạn có hiểu định dạng điểm nổi IEEE-754 không? Bạn đã nghiên cứu tài liệu tham chiếu ngôn ngữ Java chưa? Điều gì làm bạn mong đợi là giá trị dấu chấm động của '0xaaaaaaaaaaaaaaaa'? –

+5

@JimGarrison: OP nói "Không thể" cho thấy họ thực sự đã cố gắng và thấy nó đưa ra một lỗi. Tôi đã không nhận thức được chữ số hex dấu chấm động trong Java bản thân mình cho đến khi tôi bắt đầu trả lời câu hỏi. –

+0

@JonSkeet thật thú vị .... –

Trả lời

57

Hóa ra là có thể, mặc dù điều đó làm tôi ngạc nhiên. Section 3.10.2 of the JLS cho cấu trúc của các dấu phẩy động, bao gồm HexadecimalFloatingPointLiteral.

public class Test { 

    public static void main(String[] args) { 
     double d1 = 0xAAAAAAAAAAAAAAAAAAp0d; 
     double d2 = 0x1.8p1d; 

     System.out.println(d1); // A very big number 
     System.out.println(d2); // 24 = 1.5 * 2^1 
    } 
} 

Các p được yêu cầu như một phần của số mũ nhị phân - giá trị sau khi p là số bit để chuyển giá trị còn lại. Các ví dụ khác:

0x1.4p0d => 1.25 (binary 0.01 shifted 0 bits) 
0x8p-4d => 0.5 (binary 1000 shifted *right* 4 bits) 
+0

Hóa ra đó là một chữ khá khó đọc, nhưng thực sự là có thể! –

+4

C có hằng số dấu phẩy động thập lục phân, với cú pháp tương tự, được thêm vào C99. –

+2

@KeithThompson - vâng, cú pháp ban đầu được áp dụng cho C99 AFAICT và sau đó di chuyển sang các ngôn ngữ khác trong C-family cũng như Python và một số ngôn ngữ khác từ đó. (Chúng hữu ích trong mã số học ở mức độ thấp, nơi cần các giá trị FP chính xác bit.) – LThode

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