如何 将 超过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 了
}
```

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

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭