Java 为什么带前导零的整数文字解释得很奇怪?

Java 为什么带前导零的整数文字解释得很奇怪?,java,Java,这张是83 System.out.println(0123) 但是这张照片是123 System.out.println(123) 为什么它是这样工作的?因为以0开头的整数文本被视为八进制数 参见的第3.10.1节,前导零表示文字使用 0123可以通过执行(1*8*8)+(2*8)+(3)转换,十进制数等于83。 由于某些原因,八进制浮点数不可用 如果不想用八进制表示文字,就不要使用前导零 还有一个0x前缀,表示文字是以十六进制(以16为基数)表示的。试试这个: public static

这张是83

System.out.println(0123)
但是这张照片是123

System.out.println(123)

为什么它是这样工作的?

因为以
0开头的整数文本被视为八进制数


参见

的第3.10.1节,前导零表示文字使用

0123可以通过执行
(1*8*8)+(2*8)+(3)
转换,十进制数等于83。 由于某些原因,八进制浮点数不可用

如果不想用八进制表示文字,就不要使用前导零

还有一个
0x
前缀,表示文字是以十六进制(以16为基数)表示的。

试试这个:

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"

第一个打印为83,因为java将0123作为八进制数,并打印该数字的十进制等价物。

printf
将执行以下操作:

如果您想改变长度,也可以将其设置为
“%0”+大小+%d”
。。。虽然如果长度是通用的,我可能会创建一些常量,如
%04d“
%012d”
,等等。

八进制(前导0)和十六进制(前导0x)是从C继承的。 比较一下,试试看

System.out.println(0x123);

在Java中,前导为零的整数文本是八进制整数(以8为基数)

因此,如果您不想将其视为八进制数,请不要使用任何以0开头的数字

0123 -> 83
1010L -> 1010  
0101L -> 65
数字
1010L
0101L
不是二进制表示(只是为了避免混淆)。
这些数字用十进制表示

即使按照中的正则表达式模式

\0n是八进制值为0n(0)的字符
(1 * 8^2) + (2 * 8^1) + (3 * 8^0) = 83
0123 -> 83
1010L -> 1010  
0101L -> 65
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