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


相关推荐

  • Java中static块执行时机

    Java中static块执行时机在使用static进行初始化的操作,怎么也执行不了!代码如下:public class StaticDemo { public static final String INIT = "init"; static { System.out.println("——StaticDemo—-"); }}…

    2022年2月27日
    40
  • 微信之夜,张小龙说视频化表达将会成为下一个十年内容领域的主题

    微信之夜,张小龙说视频化表达将会成为下一个十年内容领域的主题因为疫情,今年微信的公开课Pro和开发者倍加关注的微信之夜放到了线上举行,微信之父,腾讯高级执行副总裁、微信事业群总裁张小龙的微信之夜直播,更是用今天他在演讲中反复提及的视频号进行直播,将今天的活动推向高潮。

    2022年5月15日
    32
  • Log4j中conversionPattern的含义「建议收藏」

    Log4j中conversionPattern的含义「建议收藏」%a–表示礼拜几,英文缩写形式,比如“Fri”%A–表示礼拜几,比如“Friday”%b–表示几月份,英文缩写形式,比如“Oct”%B–表示几月份,“October”%c–

    2022年7月2日
    25
  • MyEclipse8.5免费的注册码[通俗易懂]

    MyEclipse8.5免费的注册码[通俗易懂]打开MyEclipse8.5,点击工具栏上的”MyEclipse”菜单–》SubscriptionInformation–》填入Subscribe和SubscriptionCode,如下:这三个,MyEclipse8.5注册码,到2017年   (1)Subscriber:jom   SubscriptionCode:wLR8ZC-855575-625668535

    2022年9月30日
    0
  • 网卡bonding模式 – bond0、1、4配置

    网卡bonding简介网卡绑定就是把多张物理网卡通过软件虚拟成一个虚拟的网卡,配置完毕后,所有的物理网卡的ip和mac将会变成相同的。多网卡同时工作可以提高网络速度,还可以实现网卡的负载均衡、冗余。bonding模式1    round-robin(mode=0)轮转策略,轮流在每一个slave网卡上发送数据包,提供负载均衡和容错能力。     

    2022年4月7日
    34
  • ReverseFind(‘\\‘)函数

    ReverseFind(‘\\‘)函数此函数表示从右开始寻找最后一个“\\”的,并返回从左开始数的索引地址。与之相对的是Find(””)函数,表示从左开始寻找第一个“\\”,并返回从左开始数的索引地址。

    2022年6月26日
    58

发表回复

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

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