6

申し分なく、私は Java でプログラミングを行って 3 年になりますが、今では非常に経験豊富だと思います。しかし、Java SE のソース コードを調べていると、予期しないことに遭遇しました。

class Double:

public static final double MIN_NORMAL = 0x1.0p-1022; // 2.2250738585072014E-308

public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324

私はこれを予期していなかったので、それが何を意味するのかわかりません。ご存じない場合は、これらの数値の後、減算演算子の前にあるpandについて言及しています。接尾辞を使用して数字を強制的に、 、 などPにすることができることは知っていますが、やに遭遇したことはありません。Java APIを確認しましたが、言及されていません。Javaプリミティブ数値リテラル修飾子の完全なリストはどこかにありますか? それらをすべて知っている人はいますか?doublelongfloatpP

参考までに、私が使用または遭遇したものを以下に示します。その目的が疑問符付きの太字で示されているもの (#それぞれの制限内の任意の数を表します):

サフィックス:

  • #= 32 ビット整数int
  • #L= 64 ビット整数long
  • #l= 別の 64 ビット整数l?
  • #f= 32 ビット浮動小数点float
  • #F= 別の 32 ビット浮動小数点数float?
  • #d= 64 ビット浮動小数点double
  • #D= 別の 64 ビット浮動小数点数double?
  • #e#= 科学表記法
  • #E#= 別の科学表記法?
  • #p= ?
  • #P= ?
  • もう?

プレフィックス:

  • 0b#= バイナリ (ベース 2) リテラル
  • 0B#= 別のバイナリ (ベース 2) リテラル?
  • 0#= 8 進数 (基数 8) のリテラル
  • #= 10 進数 (基数 10) のリテラル
  • 0x#= 16 進数 (基数 16) のリテラル
  • 0X#= 別の 16 進数 (基数 16) のリテラル?
  • もう?

その他 (これらのサフィックスまたはプレフィックスはありますか? ):

  • (byte)#= 8 ビット整数byte
  • (short)#= 16 ビット整数short
  • (char)#- 32 ビット文字char
4

3 に答える 3

7

P は指数です。資本かどうかは関係ありません。

Javadoc fortoHextString (で始まるため、使用されていることがわかっています0x

public static String toHexString(double d)double 引数の 16 進文字列表現を返します。以下のすべての文字は ASCII 文字です。引数が NaN の場合、結果は文字列 "NaN" になります。それ以外の場合、結果は引数の符号と大きさを表す文字列になります。符号が負の場合、結果の最初の文字は '-' ('\u002D') です。符号が正の場合、符号文字は結果に表示されません。マグニチュード m については:

  • m が無限大の場合、文字列 "Infinity" で表されます。したがって、正の無限大は結果 "Infinity" を生成し、負
    の無限大は結果 "-Infinity" を生成します。

  • m がゼロの場合、文字列 "0x0.0p0" で表されます。したがって、負のゼロは結果 "-0x0.0p0" を生成し、正のゼロは結果 "0x0.0p0" を生成します。

  • m が正規化された表現の double 値である場合、仮数フィールドと指数フィールドを表すために部分文字列が使用されます。仮数は文字「0x1」で表されます。その後に、仮数部の残りを分数として小文字の 16 進数で表したものが続きます。16 進表現の末尾のゼロは、すべての桁がゼロでない限り削除されます。ゼロの場合は、単一のゼロが使用されます。次に、指数は、指数値に対する Integer.toString の呼び出しによって生成されるかのように、バイアスのない指数の 10 進文字列が続く "p" によって表されます。

  • m が非正規表現の double 値の場合、仮数は文字 "0x0" で表されます。その後に、仮数部の残りの部分を 16 進数で表したものが続きます。16 進表現の末尾のゼロは削除されます。次に、指数は「p-1022」で表されます。非正規仮数には少なくとも 1 つのゼロ以外の数字がなければならないことに注意してください。

JLSによると、次の文法が受け入れられます。

3.10.1. Integer Literals

IntegerTypeSuffix:

  • l
  • L

8 進数:

  • 0 8 桁
  • 0 アンダースコア

16 進数:

  • 0 x 16 進数
  • 0 X 16 進数

二進数:

  • 0 b 2 進数
  • 0 B BinaryDigits

3.10.2. Floating-Point Literals

ExponentIndicator: のいずれか

  • e

FloatTypeSuffix: のいずれか

  • d
  • D

16 進数:

  • 16 進数
  • 16 進数。
  • 0 x HexDigitsopt . 16 進数
  • 0 X HexDigitsopt . 16 進数

BinaryExponentIndicator: の 1 つ

  • p
  • P

これらの目的のために、他の単一文字リテラルは指定されていません。

于 2012-08-30T23:08:06.067 に答える
3

リテラルを宣言する正当な方法はすべてJLSで定義されています。

  • pまたはP数値の 2 進指数です。
  • lまたはLを定義しlongます。
  • fまたはFを定義しfloatます。
  • dまたはDを定義しdoubleます。
  • 0Bまたは0bバイナリリテラルを定義します。
  • 0xまたは0X16 進リテラルを定義します。
  • eorEも指数ですが、eは 16 進数で有効な文字であるため、pも使用されます。
于 2012-08-30T23:09:39.763 に答える
0

PまたはpですBinaryExponentIndicator。Java言語仕様を参照してください。

http://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html#3.10.2を参照してください

于 2012-08-30T23:12:00.203 に答える