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隐式转换都会出现此类问题

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

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

(0)
上一篇 2022年5月13日 下午12:00
下一篇 2022年5月13日 下午12:00


相关推荐

  • 开源协议均为什么协议_常见的计算机网络协议有哪些

    开源协议均为什么协议_常见的计算机网络协议有哪些一直对各种开源协议比较模糊,特意在网上搜索了一下资料,整理总结,以作记录如果不喜欢长篇大论的话,看下图就可以了基本概念了解:1.Contributors和RecipientsCon

    2022年8月2日
    9
  • 一文弄懂罗斯蒙特644温度变送器接线

    一文弄懂罗斯蒙特644温度变送器接线罗斯蒙特644温度变送器分为单输入644H和双输入644S两种,昌晖仪表在本文介绍温度变送器644接线,大家学习一起罗斯蒙特644温度变送器接线的注意事项。问题1:下图①位置这四个端子是干什么的?问题2:下图②位置这三个端子是干什么的?问题3:下图③位置这三个端子是干什么的?问题4:下图④位置这个插针是干什么的?问题5:下图⑤位置拨盘L和H位置代表什么?问题6:上图⑥位置这两个端子是干什么的?结…

    2022年6月21日
    78
  • HYSBZ 2243 染色 (树链拆分)

    HYSBZ 2243 染色 (树链拆分)

    2022年1月3日
    41
  • 4个线程池_vc2010线程win32线程已退出

    4个线程池_vc2010线程win32线程已退出在windows中,系统提供了QueueUserWorkItem函数实现异步调用,这个函数相当于在线程池中建立多个用户工作项目,跟普通线程机制一样,线程池也有线程的同步等机制。 【函数原型】BOOLWINAPIQueueUserWorkItem(__inLPTHREAD_START_ROUTINEFunction,__inP…

    2026年3月4日
    4
  • html鼠标点击后变换样式,css鼠标样式(css鼠标点击切换样式)

    html鼠标点击后变换样式,css鼠标样式(css鼠标点击切换样式)css鼠标样式新浪博客代码个性化CSS鼠标样式网址完整问题:新浪博客代码个性化CSS鼠标样式网址好评回答:进入控制面版→维护首页内容→自定义空白面版→输入方框内代码,有的人给出的代码还要打字,我的不需要,其实在代码里加入一个就可以了,因为这个东西是HTML代码里的空格,相当于有内容了.—-…

    2022年5月30日
    48
  • matlab怎么画二元函数_matlab求解二元方程

    matlab怎么画二元函数_matlab求解二元方程plot:画线(curve,二维空间以及三维空间)surf:画面(surface,一般在三维空间)1.surf绘图函数surf是surface的缩写,表示表面(显然至少三维图像才会有表面);z=3×2+3y2+3xy+1−3x−3y自变量区域的指定比如这样的一个定义域,D={(x,y)|x≥0,y≥0,x+y≤1}…

    2025年9月4日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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