10

我的简单问题是为什么:

System.out.println(010|4);

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

4

6 回答 6

13

前导0表示八进制数值,因此可以对值010进行解码:010 = 1 * 81 + 0 * 80 = 8

于 2013-07-04T12:07:43.860 回答
11

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

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

[...]

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

现在你应该明白为什么0108.

于 2013-07-04T12:08:34.033 回答
2

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

于 2013-07-04T12:13:50.183 回答
2

正如每个人在这里提到的那样,这010是一个八进制整数文字。前导0指定它是八进制表示。实际值为:

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

现在回到SOP:

System.out.println(010|4);

010对and应用按位或4(仅考虑最后 4 位)=>

1000|0100

= 1100

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

= 8 + 4 + 0 + 0

= 12(十进制)

于 2013-07-04T12:21:43.973 回答
1

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

于 2020-04-19T13:54:44.693 回答
0

有一点你应该考虑如果“0XX”,即两个X都在[0,7]范围内,数字将是八进制,否则会导致“整数太大”。

于 2021-04-29T15:00:31.057 回答