如何 将 超过int最大值的 long值 转成int , 然后再转换回来

版权声明:转载请注明出处。 https://blog.csdn.net/diyu122222/article/details/80694361

因为 long值 如果 超过int的最大值, 在转换成int的时候, 会出现丢失位的现象 ,
所以通过普通的方法 是转不回来的,
需要进行位运算, 才可以

    public static void main(String[] args) {

        // 定义 16 进制数 的字符串 :  f3000192
        String s16 = "f3000192";

        // 将 16进制 转为 10进制
        // f3000192 = 2*16`0 + 9*16`1 + 1*16`2 + 0*16`3 + 0*16`4 + 0*16`5 + 3*16`6   + 15*16`7    = 4076863890 
        //          = 2*1    + 144    + 1*256  + 0      + 0      + 0      + 50331648 + 4026531840 = 4076863890
        Long parseLong = Long.parseLong(s16, 16);
        System.out.println(parseLong);// 结果为 4076863890

        /*
         * long 的取值 范围 为 -2^63~2^63-1 
         * int  的取值 范围 为 -2147483648~2147483647 
         * 
         * 将 long 强转为 int时 ; 因为 数字 超过了 int 的最大值范围
         * 4076863890 long
         * 2147483647 int
         * 
         * long是64位的,转成int的时候直接把高32位去掉了
         * 
         * 比如
         * Long.MAX_VALUE在Java中的值是2的63次方,即011111111111111(63个1) 
         * 最前面的是符号位 0为正数,1为负数,int截取了后面的32位数 为111111111(32个1) 
         */
        Integer parseInt = parseLong.intValue();
        System.out.println(parseInt);// 结果为 -218103406
        // 再将 int 转回 成 long 此时 已经 转不回来了
        System.out.println(parseInt.longValue());// 结果仍然 为 -218103406

        /*
         * 转换成int类型以后,数字的最高位是1的缘故,所以为负数
         * 转换回来要变成正数,需要按照取反加1的原则
         * 
         * 用>>>无符号向右位移一位,
         * 然后再转换成long再用<<符号左位移一位,
         * 
         * 因为向右位移一位会丢失一位,因此要判断数字是否为奇数,
         * 如果是奇数,那么最右一位为1,那么转换完成以后要+1,
         * 如果是偶数,最右一位是0,那么左位移以后就不用再做处理了。
         * 
         * 位运算可以程序设计的基础,虽然不常用到,但是能解决很多棘手的问题
         */
        long turnback = parseInt >>> 1; // 右位移运算,向右位移一位
        turnback <<= 1;

        // 判断是否为奇数,奇数加1
        if (parseInt % 2 != 0) {
            turnback += 1;
        }
        System.out.println(turnback);// 结果 又 变回 4076863890 了
    }
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页