为什么Java会切断这个长的高阶位?

时间:2013-09-01 21:07:29

标签: java types casting jvm type-conversion

请考虑以下代码:

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

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

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

  2. 为什么订单很重要?

2 个答案:

答案 0 :(得分:6)

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

订单很重要,因为0xFFFFFFFFL != (long) 0xFFFFFFFF

就像(double) 0.1F != 0.1

一样

答案 1 :(得分:1)

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

在第二个示例中,因为java使用two's-complement二进制表示,所以表达式0xFFFFFFFF-1作为int,当扩展为{{1}时}保持为long,因此您编码-1,给出零。