我有以下代码
int a = 01111;
System.out.println("output1 = " + a);
System.out.println("output2 = " + Integer.toOctalString(1111));
,输出
output1 = 585 output2 = 2127
我期待输出如下。
output1 = 2127 output2 = 2127
为什么在打印直接int值时会给585
?我期待java自动将前导零转换为八进制值。
01111
和585
之间的关系是什么?
答案 0 :(得分: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十进制。
答案 1 :(得分:3)
System.out.println("output2 = " +Integer.toOctalString(1111));
将十进制字符串1111
转换为八进制字符串:2127
。
八进制1111
的十进制值是585
- 正如预期的那样,结果是预期的,你不会得到相同的值,因为这两个语句做了不同的事情。
正确的测试将是:
System.out.println("output2 = " +Integer.toOctalString(a));
正如预期的那样,1111
答案 2 :(得分: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)