为什么“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组成 ,并且可以表示正整数,零整数或负整数。
现在你应该明白为什么010
是8
。
前导0
表示八进制数值,因此可以解码值010
: 010 = 1 * 8 1 + 0 * 8 0 = 8
这是因为java将其作为八进制文字,因此产生12.尝试System.out.println(10|4)
,结果为14.因为这次它被视为十进制文字。
正如大家在这里提到的那样, 010
是Octal Integer字面值 。 前导0
指定它是八进制表示。 实际值将是:
1 * 8 ^ 1 + 0 * 8 ^ 0 = 8(十进制)= 1000(仅二进制后4位数)
现在回到SOP:
System.out.println(010|4);
在010
和4
上应用按位OR(仅考虑最后4位数)=>
1000 | 0100
= 1100
= 1 * 2 ^ 3 + 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0
= 8 + 4 + 0 + 0
= 12(十进制)