web-dev-qa-db-ja.com

先行ゼロを含む整数

System.out.println(0123);と書くと、_83_を取得しますが、System.out.println((int)0123F);は_123_を出力します。

なぜそれがそのように機能するのですか?

49
IAdapter

8進数(8進数)

0123は octal 123、つまり1 * 8 * 8 + 2 * 8 + 3で、83に相当します。理由は、8進浮動小数点数は使用できません。

0123の作成は整数83を意味します。0123Fの作成は浮動123を意味します。整数に戻すと、123のままになります。

8進数を意味しない場合は、先頭の0を使用しないでください。結局のところ、それらは正確には有用ではありません(そして、8進数について知っているプログラマは、09Fを見ると混乱します)。

85
luiscubal

0で始まる整数リテラルは8進数として扱われるためです。

[〜#〜] jls [〜#〜] のセクション3.10.1を参照してください

15
toolkit

これを試して:

public static String leftPad(int n, int padding) {
    return String.format("%0" + padding + "d", n);
}
leftPad(5, 3); // return "005"
leftPad(15, 5); // return "00015"
leftPad(224, 3); // return "224"
leftPad(0, 4); // return "0000"
9
ryeguy

8進数(先頭の0)と16進数(先頭の0x)はCから継承されました。比較のために、

System.out.println(0x123);
4
Peter Lawrey

Javaは8進数として0123を取り、その数字に相当する10進数を印刷するため、最初の1つは83として印刷されます。

4
neoms21
0123 -> 83
1010L -> 1010  
0101L -> 65

番号1010Lおよび0101Lは、バイナリ表現ではありません(混乱を避けるためです)。
これらの数値は10進表記です。

Oracle docs の正規表現パターンに従っても、

\ 0nは8進数値0n(0 <= n <= 7)の文字です
\xhhは、16進値0xhhの文字です

したがって、あなたの番号0101IntegerまたはLongの形式であっても、数値の8進表現として扱われます。

123 => 1 * 8^2 + 2 * 8^1 + 1 * 8^0 = 83
0101 => 1 * 8^2 + 0 * 8^1 + 1 * 8^0 = 64 + 0 + 1 = 65
1
Devendra Lattu

printfはそれを行います: http://Java.Sun.com/developer/technicalArticles/Programming/sprintf/

public class X
{
    public static void main(final String[] argv)
    {
        System.out.printf("%04d", 123);
        System.out.println();
    }
}

また、長さを変更したい場合は"%0" + size + "%d"にすることもできますが、長さが共通の場合は、おそらく"%04d""%012d"などの定数を作成します。

0
TofuBeer

In Java先行ゼロの整数リテラルは8進整数(基数8)です。

1 * 8^2 + 2 * 8 + 8 = 83

したがって、8進数として扱いたくない場合は、0で始まる番号を使用しないでください。

接尾辞が「F」の数字は、フロート数として扱われます。

与えられた例では、(inf)0123F123を出力します。これは、0123Fがfloat(123)として扱われ、int値に変換されたため、123のままであるためです。

0
Anil Satija