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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Flink SQL Client初探

    Flink SQL Client初探

    2020年11月19日
    213
  • 什么是JavaSE,写给第一次接触Java的人

    什么是JavaSE,写给第一次接触Java的人Java语法基础Java开发环境搭建Java概述Java是一门编程语言,是用来编写软件的。QQ、迅雷、淘宝、京东等等这些常用软件都可以用Java来编写。其实,Java最擅长的是编写如下类型的软件:1、互联网:电商、P2P2、企业级应用:ERP、CRM、BOS、OAJavaSE是java分类中的标准版,是刚接触java要学习的基础知识。JavaEE是java分类中的企

    2022年7月8日
    22
  • java计时器StopWatch「建议收藏」

    java计时器StopWatch「建议收藏」  1、一般我们检测某段代码执行的时间,都是以如下方式来进行的:publicstaticvoidmain(String[]args){longstartTime=System.currentTimeMillis();//获取开始时间//函数主体代码longendTime=System.currentTimeMi…

    2022年6月23日
    26
  • python字典由键插值_SciPyTutorial-一元插值interp1d

    python字典由键插值_SciPyTutorial-一元插值interp1d10.ScipyTutorial-插值interp1d插值,即依据一系列的点$(x_i,y_i)$通过一定的算法找到一个合适的函数来包含(逼近)这些点,反应出这些点的走势规律。interp1d。scipy.interpolate包里有很多的模块可以实现对一些已知的点进行插值,即找到一个合适的函数,例如模块interp1d。当得到插值函数后便可用这个插值函数计算其他$x_j$对应的的$y_j…

    2022年5月15日
    89
  • 一文详解蒙特卡洛(Monte Carlo)法及其应用

    一文详解蒙特卡洛(Monte Carlo)法及其应用我的机器学习教程「美团」算法工程师带你入门机器学习已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~概述…

    2022年5月23日
    51
  • 高通搜网流程_搜艺贝流程

    高通搜网流程_搜艺贝流程这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入https:…

    2022年10月7日
    4

发表回复

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

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