2015-07-11 78 views
3

前导零我有以下代码关于整数值

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

和输出是

output1 = 585 
output2 = 2127 

我期待输出到像的下方。

output1 = 2127 
output2 = 2127 

为什么它给585当我打印直接int值?我期待Java自动将值从前导零转换为八进制。

01111585之间的关系是什么?

+0

'585'是一个小数,'1111'是'585'的八进制等效物 – adatapost

回答

4

前导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十进制。

+0

这是OP所期待的而没有得到的。问题是:为什么他没有得到它?或者确切地说,为什么它与其他印刷声明不同。 – amit

+0

@amit'当我打印直接的int值时,为什么它会给585?'暗示他得到了585,尽管他没有想到它。 – Eran

+0

错误。这就是他正在得到,但不期待 – Klaster

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

是十进制字符串1111转换为八进制字符串:2127

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

正确的测试将是:

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

,这将给你如市场预期,1111

0

如果有0一些文字开始就表示八进制基地。同样,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)