2

考虑以下代码:

System.out.println(1 + 0xFFFFFFFFL);
System.out.println(1L + 0xFFFFFFFF);

第一行打印期望值,4294967296。但第二行打印一个0. 我检查了两个表达式的类型(通过将它们传递给方法)并且都被longJVM 识别。Lava 7 语言规范规定,对于二进制操作,“如果任一操作数的类型为 long,则另一个操作数将转换为 long。” 似乎这就是正在发生的事情,但我有两个问题:

  1. 如果两个操作数最终都是长整数,为什么第一个表达式中的高位被截断?

  2. 为什么顺序很重要?

4

2 回答 2

6

0xFFFFFFFF等于-1。当你添加1 + -1你得到0。

顺序很重要,因为0xFFFFFFFFL != (long) 0xFFFFFFFF

就像(double) 0.1F != 0.1

于 2013-09-01T21:12:34.243 回答
1

默认情况下,在 java 中所有数字常量都是int.

在第二个示例中,因为 java 使用二进制补码表示,所以表达式0xFFFFFFFF-1an int,当扩展为 a 时,它long保持为-1,因此您已编码1 + -1,给出零。

于 2013-09-01T21:09:40.660 回答