zoukankan      html  css  js  c++  java
  • 混淆视听的感脚

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

  • 相关阅读:
    [整理]Win下好用的Markdown工具
    tcpip http socket
    [整理].net中的延迟初始化器
    [整理]ASP.NET WEB API 2学习
    [整理]ASP.NET MVC 5
    [转载]AngularJS 指令 用法
    [整理]HTML5 WebSocket
    [整理]CSS3 滤镜
    [整理]WebAPP开发的框架
    [整理]AngularJS移动端开发遇到的问题
  • 原文地址:https://www.cnblogs.com/havenenjoy/p/4547551.html
Copyright © 2011-2022 走看看