我的简单问题是:
System.out.println(010|4);
打印“12”?我理解按位OR运算符,但为什么“010”等于8?这绝对不是恭维2的通知,那么如何解码这个数字?
答案 0 :(得分:7)
前导0
表示octal numeric value,因此可以解码值010
:010 = 1 * 81 + 0 * 80 = 8
答案 1 :(得分:6)
查看Java Language Specification, Chapter 3.10.1 Integer Literals
整数文字可以用十进制(十进制)表示,十六进制 (基数16),八进制(基数8),或二进制(基数2)。
[...]
八进制数字由ASCII数字0后跟一个或多个组成 ASCII数字0到7 穿插着下划线,并且可以 表示正整数,零整数或负整数。
现在你应该理解为什么010
是8
。
答案 2 :(得分:1)
这是因为java将其作为八进制文字,因此产生12.尝试System.out.println(10|4)
,结果为14.因为这次它被视为十进制文字。
答案 3 :(得分:1)
正如大家在此提到的那样,010
是一个八进制整数文字。前导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(十进制)
答案 4 :(得分:1)
Java中符合以下条件的任何数字- A.数字应有三个或更多数字 B.Number应该以0开头。 如果以上条件为true,则将数字视为Octal_Base(8)Number。 因此, 010 =(8 ^ 2)* 0 +(8 ^ 1)* 1 +(8 ^ 0)* 0 = 64 * 0 + 8 * 1 + 1 * 0 = 8 所以, 010 = 8
答案 5 :(得分:0)
有一点你应该考虑如果“0XX”这个数字是八进制的,即两个X都在[0,7]范围内,否则会导致“整数太大”。