十六进制的趣事
阅读下述代码:
import java.util.*; public class Fifth{ public static void main(String[] args){ System.out.println(Long.toHexString(0x100000000L + 0xcafebabe)); } }
输出什么?是1cafebabe吗?
如果你回答是,那就错了?
该是什么呢?
cafebabe
探究:
1、十进制字面常量具有一个很好的属性,即所有的十进制字面常量都是正的,而十六进制和八进制就没有这个属性了。观察一下0xcafebabe是正数还是负数?
2、混合类型计算。int会向long进行扩展,而这里的扩展还要注意符号扩展,由于0xcafebabe是负数,因此变成long型是0xffffffffcafebabe,之后与0x100000000L相加
最终结果会是cafebabe
修正程序
import java.util.*;
public class Fifth{
public static void main(String[] args){
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));
}
}
//尽量避免混合类型的计算