请参阅以下示例:
int a = 0111;
System.out.println(a);
Output: 73
为什么会发生这种情况?如何在没有转换的情况下获得准确值?
答案 0 :(得分:3)
根据Java语言规范3.10.1. Integer Literals,有4种方法可以编写整数文字:
1-9
后跟零个或多个数字0-9
或数字0
。0x
后跟一个或多个十六进制数字(0-9
,a-f
)。不区分大小写。0
后跟一个或多个数字0-7
。0b
后跟一个或多个数字0
或1
。不区分大小写。(为了清楚起见,所有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
所以0_111
将以同样的方式解释。
在java代码中使用的格式为:
0b111
实际上将其解释为7 - in binary format - 正如预期的那样。
我稍后会添加链接,我有点匆忙。