为什么“010”等于8?

我的简单问题是为什么:

System.out.println(010|4); 

打印“12”? 我理解按位OR运算符,但为什么“010”等于8? 这绝对不是恭维2的通知,那么如何解码这个数字呢?

查看Java语言规范,第3.10.1章整数文字

整数字面值可以用十进制(基数10),hex(基数16), 八进制(基数8)或二进制(基数2)表示。

[…]

八进制数字由ASCII数字0后跟一个或多个散布有下划线的ASCII数字0到7组成 ,并且可以表示正整数,零整数或负整数。

现在你应该明白为什么0108

前导0表示八进制数值,因此可以解码值010010 = 1 * 8 1 + 0 * 8 0 = 8

这是因为java将其作为八进制文字,因此产生12.尝试System.out.println(10|4) ,结果为14.因为这次它被视为十进制文字。

正如大家在这里提到的那样, 010Octal Integer字面值 。 前导0指定它是八进制表示。 实际值将是:

1 * 8 ^ 1 + 0 * 8 ^ 0 = 8(十进制)= 1000(仅二进制后4位数)

现在回到SOP:

 System.out.println(010|4); 

0104上应用按位OR(仅考虑最后4位数)=>

1000 | 0100

= 1100

= 1 * 2 ^ 3 + 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0

= 8 + 4 + 0 + 0

= 12(十进制)