为什么"010"等于8?

10

我的简单问题是为什么:

System.out.println(010|4);

输出"12"? 我理解按位或运算符,但为什么"010"等于8?它绝对不是二进制补码表示法,那么如何解码这个数字?


4
那是一个八进制字面量!更具体地说:1*8^1 + 0*8^0 = 8 - AllTooSir
6个回答

13

在IT技术中,前导的0表示一个八进制数值,因此数值010可以这样解码:010 = 1 * 81 + 0 * 80 = 8


11
请看 Java 语言规范第三章 3.10.1 节整数字面值

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

[...]

八进制数字由 ASCII 数字 0 后跟一个或多个 ASCII 数字 0 到 7间隔下划线组成,可表示正、零或负整数。

现在你应该明白为什么 0108 了。


2

正如其他人在这里提到的,010是一个八进制整数字面量。前导的0指定它是一个八进制表示法。实际值将是:

1*8^1 + 0*8^0 = 8(十进制) = 1000(二进制-仅保留最后4位)

现在回到SOP:

System.out.println(010|4);

对仅考虑最后四位数字的0104应用按位或操作 =>

1000|0100

= 1100

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

= 8 + 4 + 0 + 0

= 12(十进制)


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

1

Java中符合以下条件的任何数字 - A. 数字应该有三个或更多数字 B. 数字应该以0开头。 如果上述条件为真,则将数字视为八进制(8)数字。 因此, 010 =(8 ^ 2)* 0 +(8 ^ 1)* 1 +(8 ^ 0)* 0 = 64 * 0 + 8 * 1 + 1 * 0 = 8 所以, 010 = 8


0

有一点需要考虑,如果数字是"0XX",即两个X的范围在[0,7]之间,则该数字将以八进制表示,否则会出现"整数过大"的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接