日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展

發布時間:2023/12/3 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天,魏屌出了一道題,題目如下:

定義一個大頭序的byte[]a={-1,-2,-3,-4},轉換成short[]b.問b[0]和b[1]分別是多少?

乍一看,這題不難,無非就是移位操作,再進行組合。但是呢?對于用Java的童鞋來說,這里面有一個坑,稍不注意可能就踩進去了。在說之前,我先把代碼和答案貼出來吧。

看到這里,可能有的童鞋比較奇怪,為啥要&0xff,這不相當于沒變化嗎?非也,不信我舉個例子。

答案是-127和129。很奇怪不是嗎?我想的明明都是-127啊!!!

解答這個問題之前,我們先注意一下,b1的類型是int,而不是byte,這是因為byte的任何計算操作之后,都默認轉成int,先明確這個概念。

然后,重頭戲來了,大學計算機組成原理我們都學過原碼,反碼和補碼,概念問題這里就不說了,也不用想書本上那些定義,學以致用嘛,一張圖說明問題。

是不是很easy?這里再強調一個問題,就是Java中只有有符號數!Java中只有有符號數!Java中只有有符號數!重要的事情說三遍!

那么好了,Java中的數值存儲就像這個大圓盤!

我們接著看為什么輸出129?已知byte經過計算之后會變成int,但是人家int是32位的啊,byte才8位,所以只能補位啦,誒呀,問題來啦,怎么補位呢?這也是今天想強調的哦!

b是byte類型,其計算機存儲的補碼是10000001(8位)。

轉成int后,Java中的擴展方式是補符號位擴展,何謂補符號位擴展?就是變成了11111111 11111111 11111111 10000001(32位),為啥要這樣變?因為這樣變還是-127,數值大小沒有變!

而我們如果&0xff呢??b&0xff=11111111 11111111 11111111 10000001&11111111=00000000 00000000 00000000 10000001,這個值就是129,這就是補零擴展啦!所以129的問題解決啦!

什么?你問補零擴展有什么用?我們回到魏屌的那道題,兩個byte合成一個short,short可是16位哦,如果我們不&0xff,即寫成

s[1] = (short)((bs[2] << 8) | bs[3]);

輸出結果發現變成了-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,

再轉成short,就是11111111 11111100,結果就是-4啦!就醬紫!

所以Java中byte和short互相轉換的代碼應該是:

//short轉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轉short

short z = (short)(((high & 0xFF) << 8) | (0xFF &low));

System.out.println(z);//輸出的結果就是-32752

最后總結一下:

因為Java中只有有符號數,當byte擴展到short, int時,即正數都一樣,因為符號位是0,所以無論如何都是補零擴展;但負數補零擴展和按符號位擴展結果完全不同。

補符號數,原數值不變。

補零時,相當于把有符號數看成無符號數,比如-127 = 0x81,看成無符號數就是129, 256 + (- 127)。

對于有符號數,從小擴展大時,需要用&0xff這樣方式來確保是按補零擴展。

而從大向小處理,符號位自動無效,所以不用處理。

總結

以上是生活随笔為你收集整理的在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。