我的简单问题是为什么:
System.out.println(010|4);
输出"12"? 我理解按位或运算符,但为什么"010"等于8?它绝对不是二进制补码表示法,那么如何解码这个数字?
我的简单问题是为什么:
System.out.println(010|4);
输出"12"? 我理解按位或运算符,但为什么"010"等于8?它绝对不是二进制补码表示法,那么如何解码这个数字?
整数字面值可以用十进制(基数为 10)、十六进制(基数为 16)、八进制(基数为 8)或二进制(基数为 2)表示。
[...]
八进制数字由 ASCII 数字 0 后跟一个或多个 ASCII 数字 0 到 7间隔下划线组成,可表示正、零或负整数。
现在你应该明白为什么 010
是 8
了。
正如其他人在这里提到的,010
是一个八进制整数字面量。前导的0
指定它是一个八进制表示法。实际值将是:
1*8^1 + 0*8^0 = 8(十进制) = 1000(二进制-仅保留最后4位)
现在回到SOP:
System.out.println(010|4);
对仅考虑最后四位数字的010
和4
应用按位或操作 =>
1000|0100
= 1100
= 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0
= 8 + 4 + 0 + 0
= 12(十进制)
System.out.println(10|4)
,结果为14。这次它被视为十进制文字。Java中符合以下条件的任何数字 - A. 数字应该有三个或更多数字 B. 数字应该以0开头。 如果上述条件为真,则将数字视为八进制(8)数字。 因此, 010 =(8 ^ 2)* 0 +(8 ^ 1)* 1 +(8 ^ 0)* 0 = 64 * 0 + 8 * 1 + 1 * 0 = 8 所以, 010 = 8
有一点需要考虑,如果数字是"0XX",即两个X的范围在[0,7]之间,则该数字将以八进制表示,否则会出现"整数过大"的错误。
1*8^1 + 0*8^0
=8
! - AllTooSir