Java 关于整数值中的前导零

Java 关于整数值中的前导零,java,Java,我有下面的代码 int a = 01111; System.out.println("output1 = " + a); System.out.println("output2 = " + Integer.toOctalString(1111)); 输出是 我期望输出如下所示 当我打印直接int值时,为什么会给出585?我希望java能够自动将前导零的值转换为八进制 01111和585之间的关系是什么 前导0表示八进制数(基数8) 01111(八进制)是1*8^3+1*8^2+1*8^1+1*

我有下面的代码

int a = 01111;
System.out.println("output1 = " + a);
System.out.println("output2 = " + Integer.toOctalString(1111));
输出是

我期望输出如下所示

当我打印直接int值时,为什么会给出
585
?我希望java能够自动将前导零的值转换为八进制


01111
585
之间的关系是什么

前导0表示八进制数(基数8)

01111(八进制)是1*8^3+1*8^2+1*8^1+1*8^0=585(十进制)

Integer.toOctalString(1111)
将十进制数字1111转换为八进制字符串。2127八进制(2*8^3+1*8^2+2*8^1+7*8^0)是1111位小数

System.out.println("output2 = " +Integer.toOctalString(1111));
正在将十进制字符串
1111
转换为八进制字符串:
2127

八进制
1111
的十进制值是
585
——正如预期的那样,结果是预期的,您不会得到相同的值,因为这两个语句做不同的事情

正确的测试将是:

System.out.println("output2 = " +Integer.toOctalString(a));

如果一个数字文字以
0
开头,它表示八进制,那么它将像预期的那样为您提供
1111

。类似地,
0x
表示十六进制基数,
0b
表示二进制数

那么你的

int a=01111;
。。实际上是

8^3 + 8^2 + 8^1 + 8^0 = 
512 + 64 + 8 + 1 = 585
Integer.toOctalString(1111))
实际上是一个反向函数,即结果是八进制数,十进制为1111,这实际上是
2127

2127(oct) = 2 × 8^3 + 1 × 8^2 + 2 × 8^1 + 7 × 8^0 = 1111(dec)

这是OP所期望的,而不是得到的。问题是:他为什么不明白?或者确切地说,为什么它不同于另一个print语句。@amit
当我打印direct int值时,为什么它给出585?
意味着他得到了585,尽管他没有预料到。@Eran我的理解失误是,我认为当你用前导零取值时,它是十进制的,当打印jvm时,将十进制值转换为八进制值…所以我认为值01111是十进制的,SOP应该将其转换为八进制值2127。但实际上JVM隐式地将01111视为八进制值,因为我已将其赋值为前导零。<代码> 585 < /代码>为十进制,<代码> 1111 /代码>为八进制相当于<代码> 585 < /代码>。
8^3 + 8^2 + 8^1 + 8^0 = 
512 + 64 + 8 + 1 = 585
2127(oct) = 2 × 8^3 + 1 × 8^2 + 2 × 8^1 + 7 × 8^0 = 1111(dec)