Java 0xffffffff隐式类型转换的坑

Java 0xffffffff隐式类型转换的坑一、场景复现项目需求,long的低32位存储ip地址,需要将ip信息展示成为字符串ip。publicstaticvoidmain(String[]args){longipLong=0x457145130A1901F6L;Stringip=longToIp(ipLong&0xffffffff);//取低32位System.ou…

大家好,又见面了,我是你们的朋友全栈君。

一、场景复现

项目需求,long的低32位存储ip地址,需要将ip信息展示成为字符串ip。

public static void main(String[] args){
     long ipLong = 0x457145130A1901F6L;
     String ip = longToIp(ipLong&0xffffffff);//取低32位
     System.out.println(ipLong);
     System.out.println(ip);
}

public static String longToIp(long longIP){
     StringBuffer sb=new StringBuffer("");
	 //直接右移24位
	 sb.append(String.valueOf(longIP>>>24));
	 sb.append(".");
	 //将高8位置0,然后右移16位
	 sb.append(String.valueOf((longIP&0x00FFFFFF)>>>16));
	 sb.append(".");
	 sb.append(String.valueOf((longIP&0x0000FFFF)>>>8));
	 sb.append(".");
	 sb.append(String.valueOf(longIP&0x000000FF));
	 return sb.toString();
}

输出:

5003856609061437942
298253095690.25.1.246

 

二、分析原因

因为long&int最终会将int类型隐式转换成long类型,而0xffffffff的值为-1(java是使用补码存储数值的),在隐式类型转换过程中扩展为long类型-1(0xffffffffffffffff),并不是0x00000000ffffffff。

所以需要将0xffffffff写为0xffffffffL(long类型),这样才能避免隐式转换带来错误的结果。

public static void main(String[] args){
     long ipLong = 0x457145130A1901F6L;
     String ip = longToIp(ipLong&0xffffffffL);//取低32位,L表示long类型
     System.out.println(ipLong);
     System.out.println(ip);
}

public static String longToIp(long longIP){
     StringBuffer sb=new StringBuffer("");
	 //直接右移24位
	 sb.append(String.valueOf(longIP>>>24));
	 sb.append(".");
	 //将高8位置0,然后右移16位
	 sb.append(String.valueOf((longIP&0x00FFFFFF)>>>16));
	 sb.append(".");
	 sb.append(String.valueOf((longIP&0x0000FFFF)>>>8));
	 sb.append(".");
	 sb.append(String.valueOf(longIP&0x000000FF));
	 return sb.toString();
}

输出:

5003856609061437942
10.25.1.246

补充:整数默认int类型,在big&small表达式中,small为(byte)0xff、(short)0xffff、(int)0xffffffff 的-1隐式转换都会出现此类问题

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145496.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java时间戳与Date相互转换

    java时间戳与Date相互转换https://www.cnblogs.com/mstk/p/5511057.htmlhttps://blog.csdn.net/fanrenxiang/article/details/80531649

  • Xmind使用技巧(xmind使用技巧)

    之前讲到思维导图笔记法的时候,给大家推荐了一款免费的思维导图软件—xmind软件,然后好多小伙伴都加我问关于思维导图的使用方法。于是今天我就做了一份关于xmind软件的使用教程。先带大家回忆一下关于思维导图的用法用处。MindMap有四个基本特点:1.注意力的焦点集中在中央图像上。2.主题作为分支从中央向四周辐射。3.分支由关键词或者关键图像构成。4.使用色彩、图画、代码加以修饰。思维导图学习法的好处:首先是方便记录,加强记忆;其次过程非常自由,结果十分清晰;最后…

  • 虚拟机怎么退出vi编辑模式_手机系统占用30个g正常吗

    虚拟机怎么退出vi编辑模式_手机系统占用30个g正常吗ESC键->冒号->小写q->(可选:不保存退出加个惊叹号!)->(可选:如文件需保存加个小写w)  当编辑完文件,准备退出Vi返回到shell时,可以使用以下几种方法之一。   (1)在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则Vi保存该文件后退出,返回到shell;若当前编辑的文件没被修改过,则Vi直接退出,返回到shel

  • CSS中的em运用详解,1em等于多少像素?

    今天要看完它:使用CSS也好久了,但一直都是在使用“px”来设置Web元素的相关属性,未敢使用“em”。主要原因是,对其并不什么了解,只知道一点概念性的东西,前段时间在项目中要求使用“em”作为单位设置元素,所以从头对“em”学习了一回。稍为有一点理解,今天特意整理了一份博文与大家一起分享,希望对童子们有些许的帮助。这篇教程将引导大家如何使用“em”来创建一个基本的弹性布局,从而学习其如何计算?又

  • Java基础面试题整理「建议收藏」

    面向对象的三个特征封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象.多态的好处允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点:可替换性:多态对已存在代码具有可替换性. 可扩充性:增加新的子类不影响已经存在的类结构. 接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者…

  • kali linux 云服务器,云服务器安装kali linux

    kali linux 云服务器,云服务器安装kali linux前言在网上可以搜索到2种在腾讯云服务器上安装kali系统的方法:第一种方法:通过挂载云硬盘到云服务器上,将kali镜像刻录到挂载的云硬盘中,利用VNC可视化安装kali系统;查看详情第二种方法:在本地搭建好kali虚拟机环境,然后通过制作符合腾讯云的kali镜像上传到腾讯云对象存储桶,利用重置系统自定义镜像功能进行安装kali;查看详情以上两中方法博主都尝试过,第一种方法安装成功过一次,而…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号