Java 0xffffffff隐式类型转换的坑
生活随笔
收集整理的這篇文章主要介紹了
Java 0xffffffff隐式类型转换的坑
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、場(chǎng)景復(fù)現(xiàn)
項(xiàng)目需求,long的低32位存儲(chǔ)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?
二、分析原因
因?yàn)閘ong&int最終會(huì)將int類型隱式轉(zhuǎn)換成long類型,而0xffffffff的值為-1(java是使用補(bǔ)碼存儲(chǔ)數(shù)值的),在隱式類型轉(zhuǎn)換過(guò)程中擴(kuò)展為long類型-1(0xffffffffffffffff),并不是0x00000000ffffffff。
所以需要將0xffffffff寫為0xffffffffL(long類型),這樣才能避免隱式轉(zhuǎn)換帶來(lái)錯(cuò)誤的結(jié)果。
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補(bǔ)充:整數(shù)默認(rèn)int類型,在big&small表達(dá)式中,small為(byte)0xff、(short)0xffff、(int)0xffffffff 的-1隱式轉(zhuǎn)換都會(huì)出現(xiàn)此類問(wèn)題
總結(jié)
以上是生活随笔為你收集整理的Java 0xffffffff隐式类型转换的坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎样查看手机上的历史记录 查看手机历史记
- 下一篇: IntelliJ IDEA 源值1.5已