System.out.println(0123);
と書くと、_83
_を取得しますが、System.out.println((int)0123F);
は_123
_を出力します。
なぜそれがそのように機能するのですか?
0123は octal 123、つまり1 * 8 * 8 + 2 * 8 + 3で、83に相当します。理由は、8進浮動小数点数は使用できません。
0123の作成は整数83を意味します。0123Fの作成は浮動123を意味します。整数に戻すと、123のままになります。
8進数を意味しない場合は、先頭の0を使用しないでください。結局のところ、それらは正確には有用ではありません(そして、8進数について知っているプログラマは、09Fを見ると混乱します)。
0
で始まる整数リテラルは8進数として扱われるためです。
[〜#〜] jls [〜#〜] のセクション3.10.1を参照してください
これを試して:
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"
8進数(先頭の0)と16進数(先頭の0x)はCから継承されました。比較のために、
System.out.println(0x123);
Javaは8進数として0123を取り、その数字に相当する10進数を印刷するため、最初の1つは83として印刷されます。
0123 -> 83
1010L -> 1010
0101L -> 65
番号1010L
および0101L
は、バイナリ表現ではありません(混乱を避けるためです)。
これらの数値は10進表記です。
Oracle docs の正規表現パターンに従っても、
\ 0nは8進数値0n(0 <= n <= 7)の文字です
\xhhは、16進値0xhhの文字です
したがって、あなたの番号0101
Integer
または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
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"
などの定数を作成します。
In Java先行ゼロの整数リテラルは8進整数(基数8)です。
1 * 8^2 + 2 * 8 + 8 = 83
したがって、8進数として扱いたくない場合は、0で始まる番号を使用しないでください。
接尾辞が「F」の数字は、フロート数として扱われます。
与えられた例では、(inf)0123F
は123
を出力します。これは、0123Fがfloat(123)として扱われ、int値に変換されたため、123のままであるためです。