在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展
今天,魏屌出了一道題,題目如下:
定義一個大頭序的byte[]a={-1,-2,-3,-4},轉(zhuǎn)換成short[]b.問b[0]和b[1]分別是多少?
乍一看,這題不難,無非就是移位操作,再進(jìn)行組合。但是呢?對于用Java的童鞋來說,這里面有一個坑,稍不注意可能就踩進(jìn)去了。在說之前,我先把代碼和答案貼出來吧。
看到這里,可能有的童鞋比較奇怪,為啥要&0xff,這不相當(dāng)于沒變化嗎?非也,不信我舉個例子。
答案是-127和129。很奇怪不是嗎?我想的明明都是-127啊!!!
解答這個問題之前,我們先注意一下,b1的類型是int,而不是byte,這是因?yàn)閎yte的任何計(jì)算操作之后,都默認(rèn)轉(zhuǎn)成int,先明確這個概念。
然后,重頭戲來了,大學(xué)計(jì)算機(jī)組成原理我們都學(xué)過原碼,反碼和補(bǔ)碼,概念問題這里就不說了,也不用想書本上那些定義,學(xué)以致用嘛,一張圖說明問題。
是不是很easy?這里再強(qiáng)調(diào)一個問題,就是Java中只有有符號數(shù)!Java中只有有符號數(shù)!Java中只有有符號數(shù)!重要的事情說三遍!
那么好了,Java中的數(shù)值存儲就像這個大圓盤!
我們接著看為什么輸出129?已知byte經(jīng)過計(jì)算之后會變成int,但是人家int是32位的啊,byte才8位,所以只能補(bǔ)位啦,誒呀,問題來啦,怎么補(bǔ)位呢?這也是今天想強(qiáng)調(diào)的哦!
b是byte類型,其計(jì)算機(jī)存儲的補(bǔ)碼是10000001(8位)。
轉(zhuǎn)成int后,Java中的擴(kuò)展方式是補(bǔ)符號位擴(kuò)展,何謂補(bǔ)符號位擴(kuò)展?就是變成了11111111 11111111 11111111 10000001(32位),為啥要這樣變?因?yàn)檫@樣變還是-127,數(shù)值大小沒有變!
而我們?nèi)绻?amp;0xff呢??b&0xff=11111111 11111111 11111111 10000001&11111111=00000000 00000000 00000000 10000001,這個值就是129,這就是補(bǔ)零擴(kuò)展啦!所以129的問題解決啦!
什么?你問補(bǔ)零擴(kuò)展有什么用?我們回到魏屌的那道題,兩個byte合成一個short,short可是16位哦,如果我們不&0xff,即寫成
s[1] = (short)((bs[2] << 8) | bs[3]);
輸出結(jié)果發(fā)現(xiàn)變成了-4。為什么呢?
還是剛才那個思路啊,bs[2]是-3,即11111101,bs[3]是-4,即11111100,
(bs[2] << 8)就變成了11111111 11111111 11111101 00000000,
((bs[2] << 8) | bs[3])就變成了11111111 11111111 11111101 00000000 | 11111111 11111111 11111111 11111100 = 11111111 11111111 11111111 11111100,
再轉(zhuǎn)成short,就是11111111 11111100,結(jié)果就是-4啦!就醬紫!
所以Java中byte和short互相轉(zhuǎn)換的代碼應(yīng)該是:
//short轉(zhuǎn)byte
short x = -32752;//定義一個short
byte high = (byte) (0xFF & (x>>8));//定義第一個byte
byte low = (byte) (0xFF & x);//定義第二個byte
System.out.println(high);//打印第一個byte值
System.out.println(low);//打印第二個byte值//byte轉(zhuǎn)short
short z = (short)(((high & 0xFF) << 8) | (0xFF &low));
System.out.println(z);//輸出的結(jié)果就是-32752
最后總結(jié)一下:
因?yàn)镴ava中只有有符號數(shù),當(dāng)byte擴(kuò)展到short, int時,即正數(shù)都一樣,因?yàn)榉栁皇?,所以無論如何都是補(bǔ)零擴(kuò)展;但負(fù)數(shù)補(bǔ)零擴(kuò)展和按符號位擴(kuò)展結(jié)果完全不同。
補(bǔ)符號數(shù),原數(shù)值不變。
補(bǔ)零時,相當(dāng)于把有符號數(shù)看成無符號數(shù),比如-127 = 0x81,看成無符號數(shù)就是129, 256 + (- 127)。
對于有符號數(shù),從小擴(kuò)展大時,需要用&0xff這樣方式來確保是按補(bǔ)零擴(kuò)展。
而從大向小處理,符號位自動無效,所以不用處理。
總結(jié)
以上是生活随笔為你收集整理的在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重新来过的网名81个
- 下一篇: java当前4中引用_Java的四种引用