使用二进制值时,Java int数据类型自动转换

时间:2016-06-02 06:28:34

标签: java

请参阅以下示例:

int a = 0111;

System.out.println(a);

Output: 73

为什么会发生这种情况?如何在没有转换的情况下获得准确值?

2 个答案:

答案 0 :(得分:3)

根据Java语言规范3.10.1. Integer Literals,有4种方法可以编写整数文字:

  • DecimalNumeral:数字1-9后跟零个或多个数字0-9或数字0
  • HexNumeral:前导0x后跟一个或多个十六进制数字(0-9a-f)。不区分大小写。
  • OctalNumeral:数字0后跟一个或多个数字0-7
  • BinaryNumeral:引导0b后跟一个或多个数字01。不区分大小写。

(为了清楚起见,所有4都允许下划线)

如您所见,数字111取决于前缀
0111 OctalNumeral )为1*8*8 + 1*8 + 1 = 64+8+1 = 73
111 DecimalNumeral )为1*10*10 + 1*10 + 1 = 100+10+1 = 111
0b111 BinaryNumeral )为1*2*2 + 1*2 + 1 = 4+2+1 = 7
0x111 HexNumeral )为1*16*16 + 1*16 + 1 = 256+16+1 = 273

哪一个是正确的取决于你想要的。

答案 1 :(得分:2)

嗯,你得到的确切价值。问题是格式。

0111

在java中被解释为八进制值。因此,您的值实际 73,因为快速计算会显示。

java中的八进制值以这种方式定义:

OctalNumeral:
    0 OctalDigits
    0 Underscores OctalDigits

jls 3.10.1

所以0_111将以同样的方式解释。

在java代码中使用的格式为:

0b111

实际上将其解释为7 - in binary format - 正如预期的那样。

我稍后会添加链接,我有点匆忙。