2017-03-10 16 views
38

私はJava認定のために勉強しています。そして、私はJavaリテラルについて興味があります。 私はこのような何かを行うことが可能です知っている:Javaの16進数の2重のリテラル

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

また、これは浮動小数点変数に対して可能です:

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

は、だから私は、論理的に同じ16進のために適用されることをこれらの例で考えました。長いリテラルのLを追加できるのと同じように、 'd'または 'f'を追加することができますが、 'F'と 'D'は有効な16進値なので、ロジックに欠陥があります。

このような何かすることはできません。

double d = 0xAAAAAAAAAAAAAAAAAAd; 

が、これはただのJavaで許可されていないか、私にはわからないこと、それを行うための簡単な方法はありますか?

+0

IEEE-754浮動小数点フォーマットについて理解していますか? Java言語のリファレンスドキュメントを勉強しましたか? '0xaaaaaaaaaaaaaaaa'の浮動小数点の値は何でしょうか? –

+5

@ジムガリソン:OPは "それは可能ではない"と言っているが、彼らは実際に試してみるとエラーを起こすことを示唆している。私はJavaの浮動小数点の16進数リテラルを、自分がその質問に答えるまで気づいていませんでした。 –

+0

@JonSkeet興味深い.... –

答えて

57

ですが、それは私には驚きました。 Section 3.10.2 of the JLSは、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 
    } 
} 

pは、バイナリ指数の一部として必要とされる - p後の値は、左の値をシフトするビット数です。その他の例:

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

それは読みにくいリテラルであることが判明しましたが、確かに可能です! –

+4

Cには、C99で追加された同様の構文を持つ16進浮動小数点定数があります。 –

+2

@KeithThompson - ええ、構文はもともとC99 AFAICTに採用されていました。そして、Cファミリの他の言語にもPythonや他の言語にも移行されました。 (ビット単位の正確なFP値が必要な低レベル数値コードでは便利です。) – LThode