【问题标题】:regarding leading zero in integer value关于整数值的前导零
【发布时间】:2015-07-11 12:28:49
【问题描述】:

我有以下代码

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自动将前导零的值转换为八进制。

01111585 是什么关系?

【问题讨论】:

  • 585 是十进制,1111 是八进制等效于 585

标签: java


【解决方案1】:

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

【讨论】:

  • 这是 OP 所期望但未得到的。问题是:为什么他没有得到它?或者更确切地说,为什么它与其他打印语句不同。
  • @amit Why does it give 585 when I print direct int value ? 暗示他得到了 585,尽管他没想到。
  • @Eran 我的理解是,我认为当你用前导零取值时它是十进制的,而在打印 jvm 时将该十进制值转换为八进制值......所以我认为值 01111 是十进制并且 SOP 应该将其转换为八进制值 2127。但实际上 jvm 隐含地将 01111 视为八进制值,因为我已为其分配了前导零。
【解决方案2】:
System.out.println("output2 = " +Integer.toOctalString(1111));

正在将十进制字符串 1111 转换为八进制字符串:2127

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

正确的测试是:

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

正如预期的那样,这会给你1111

【讨论】:

    【解决方案3】:

    如果数字文字以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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多