因为 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 了
}
```
今天的文章如何 将 超过int最大值的 long值 转成int , 然后再转换回来分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/10415.html