混淆视听的感脚

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,那么不管它将要被转换成什么类型,都执行零扩展。

posted @ 2015-06-02 20:17  normalpers  阅读(143)  评论(0编辑  收藏  举报