混淆视听的感脚
1.整除 (缄默杀手)
如下代码,貌似打印的是1000,其实打印的是5.
@Test public void testBa(){ final long micro = 24*60*60*1000*1000;//86400,000,000 System.out.println((int)micro); final long mill = 24*60*60*1000; System.out.println(micro/mill); // 500654080/86400000 //2147483647=2^31 }
问题在于整除的时候,第一个入参在转换为整型的时候缩小了172倍,导致在真正运算的时候除数已经缩小了。
问题解决如下,让数据在运算时不进行数据的转换。标识long型的L要大写(习惯).
@Test public void testBa(){ final long micro = 24L*60*60*1000*1000;//86400,000,000 final long mill = 24L*60*60*1000; System.out.println(micro/mill); }
补充说明:micro在转为int的时候,实际上是二进制的转换(窄化原始类型转化),且为强制类型转换,会将高八位的数据给舍弃掉,
即1 0100 0001 1101 1101 0111 0110 0000 0000 0000变为0001 1101 1101 0111 0110 0000 0000 0000,十进制中刚好缩小了172倍.
有一条很简单的规则能够描述从较窄的整 型转换成较宽的整型时的符号扩展行为:如果最初的数值类型是有符号的,那么就执行符号扩展;如果它是char,那么不管它将要被转换成什么类型,都执行零扩展。