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)


相关推荐

  • STM32F103使用标准库移植RT-Thread标准版的Finsh

    STM32F103使用标准库移植RT-Thread标准版的Finshrtt标准版中stm32的bsp使用的是HAL库,现在想换成标准库。相比于rttnano的移植来说,和标准版的移植还是有不小的差别的,至少我个人这么认为。nano在移植过程中只需要按照#error提示修改好board.c即可。当然如果需要使用finsh的话,你还需要补充完成finsh_board.c和串口的一些信号,具体参见官方文档。整个流程还是相当清晰的,工作量也不大。移植标准版的另一个原因是我想使用ATClient。刚开始我尝试直接向nano版本中进行添加,但似乎…

  • 第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令[通俗易懂]

    第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令[通俗易懂]第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令

  • node.js安装及环境配置超详细教程【Windows系统安装包方式】

    node.js安装及环境配置超详细教程【Windows系统安装包方式】简单的说Node.js就是运行在服务端的JavaScript。Node.js是一个基于ChromeJavaScript运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

  • substring截取字符串特定位置的值

    substring截取字符串特定位置的值1、截取指定字符上的字符串:substring(start,end)start:开始的位置(从0开始索引)包括该位置的字符,不可省略end:结束的位置(不包括该位置上的字符),可省略例:Stringstr=“第1周”;str=str.substring(1,2);str此时里面就剩一个1了若start与end相等,那么返回的就是一个空串若start比end大…

  • String、StringBuffer和StringBuilder的区别

    String、StringBuffer和StringBuilder的区别String、StringBuffer和StringBuilder的区别:文章目录StringStringBufferStringBuilderStringBuffer是如何实现线程安全的呢?Java9的改进String  String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。  这个是String类的解释,之前小咸儿看…

  • 高通QXDM工具使用

    高通QXDM工具使用1.连接机器2.打开设备管理器查看端口3.查看调制解调器属性4.打开QXDM运行程序5.连接6.连接成功7.发送AT指令(发送成功会有回显)

发表回复

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

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