一、谜题
两个16进制数相加,会输出什么呢? 代码如下:
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
预想的是:1cafebabe
但是实际上: cafebabe ,最高位1没有了
二、解惑
十进制字面常量都是正的,比如 1000 ,负数通过 “ - ” 来表示 。
但是16进制 和 8 进制字面常量 并不是这么回事, 他们可以是正值也可以是负值。 如果它们的最高位非零,就是负值。
0xcafebabe 是一个负数, 等于十进制的-889275714 。
做加法运算时,0xcafebabe 被提升为 long 类型 ,0xffffffffcafebabeL ,相加后得到 0x00000000cafebabeL 。
三、修正
把右操作数0xcafebabe 用long 来表示,可以避免这种结果。
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));