成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java位運(yùn)算和字節(jié)編碼(一)

Dongjie_Liu / 2301人閱讀

摘要:正數(shù)的原碼,反碼和補(bǔ)碼相同。變量原碼反碼是符號(hào)位不變,其他位取反反碼補(bǔ)碼則是在反碼的基礎(chǔ)上加補(bǔ)碼所以在計(jì)算機(jī)中正確的表示應(yīng)該是。原碼反碼補(bǔ)碼此刻開始轉(zhuǎn)換為類型,占個(gè)字節(jié),符號(hào)位,用填充高位三個(gè)字節(jié)。

我們都知道計(jì)算機(jī)存儲(chǔ)的是二進(jìn)制,長(zhǎng)度是8個(gè)比特。

byte b = 10;
int i = -10;
long l = 10L;

那么以上幾個(gè)變量如何用二進(jìn)制表示呢?
很多人第一印象肯定是 b變量占用一個(gè)字節(jié),也就是8位,所以 b用二進(jìn)制表示就是 1010,高位補(bǔ)零,所以是 00001010。那么i是int,占用4個(gè)字節(jié),也就是32位,但因?yàn)槭秦?fù)數(shù),所以最高位是100000000 00000000 00000000 00001010。同理 l變量則是 00000000 00000000 00000000 00000000 000000000 00000000 00000000 00001010。

上面的推理過程中存在一處錯(cuò)誤,就是在java中存儲(chǔ)的是補(bǔ)碼,而不是原碼。正數(shù)的原碼,反碼和補(bǔ)碼相同。負(fù)數(shù)則不是一樣。以上面 int i = -10 作為例子。

變量 i
原碼 1000 1010
# 反碼是符號(hào)位不變,其他位取反
反碼 1111 0101
#補(bǔ)碼則是在反碼的基礎(chǔ)上加1
補(bǔ)碼 1111 0110

所以-10 在計(jì)算機(jī)中正確的表示應(yīng)該是 1111 0110。
上面我們已經(jīng)學(xué)習(xí)原碼,反碼和補(bǔ)碼相關(guān)的概念,至于為什么要用補(bǔ)碼,感興趣的可以自己去查。

我們也知道在網(wǎng)絡(luò)傳輸中,存儲(chǔ)的就是二進(jìn)制相關(guān)的byte數(shù)組。那么現(xiàn)在我們需要往消息中寫入int或者long相關(guān)的信息,如何轉(zhuǎn)換為byte數(shù)組中的相關(guān)項(xiàng)?第一個(gè)想到的辦法就是強(qiáng)制轉(zhuǎn)換。

int x = 135;
System.out.println((byte)x);  /** 輸出-121 **/

x = -135;
System.out.println((byte)x); /** 輸出-121 **/

可見輸出的答案并不如你所愿。想知道為什么這樣嗎?感興趣的可以自己去推導(dǎo)。
額,還是幫你們推導(dǎo)一遍吧。我們以 -135為例。
首先我們知道 int 占用4個(gè)字節(jié),而byte占用1個(gè)字節(jié),同時(shí)你也看到 -135已經(jīng)超出了一個(gè)字節(jié)所能表示的范圍[-128, 127]。如果強(qiáng)制轉(zhuǎn)換后還能顯示出正確結(jié)果,那才恐怖啊。

-135

原碼 10000000 00000000 00000000 10000111

反碼 11111111 11111111 11111111 01111000

補(bǔ)碼 11111111 11111111 11111111 01111001

我們知道java中存儲(chǔ)的是補(bǔ)碼,可是因?yàn)閎yte只占一個(gè)字節(jié),所以轉(zhuǎn)換的時(shí)候只取到最低位那個(gè)字節(jié)也就是 01111001作為轉(zhuǎn)換后補(bǔ)碼存在。因?yàn)檎龜?shù)的原碼和補(bǔ)碼相同,也即是這個(gè)字節(jié)的原碼是01111001,原值是 121。

剛才我們討論的是int強(qiáng)制轉(zhuǎn)換成byte類型可能存在的問題。那么如果我需要把byte類型的強(qiáng)制轉(zhuǎn)換成int類型的會(huì)出現(xiàn)什么樣的問題。

byte num = 120;        
System.out.println((int)num); 
num = -120;
System.out.println((int)num);

大家看到這兩行示例代碼時(shí)。盡量自己嘗試推導(dǎo)出結(jié)果來,不要看我下面的推導(dǎo)過程。
我們以-120作為例子,嘗試推導(dǎo)下(看到?jīng)]有,我喜歡負(fù)數(shù))。

-120

原碼 11111000

反碼 10000111

補(bǔ)碼 10001000

##此刻開始轉(zhuǎn)換為int類型,占4個(gè)字節(jié),符號(hào)位1,用1填充高位三個(gè)字節(jié)。如果符號(hào)位是0,高位會(huì)用0填充。

補(bǔ)碼 11111111 11111111 11111111 10001000 /** 存儲(chǔ)在內(nèi)存中的int整形補(bǔ)碼 **/
反碼 11111111 11111111 11111111 10000111
原碼 10000000 00000000 00000000 01111000 
原值 -120

所以 當(dāng) byte num = -120 時(shí), (int)num = -120
我相信很多人都沒有自己推導(dǎo),直接看我的推導(dǎo)的。那么再給你個(gè)機(jī)會(huì),嘗試推導(dǎo)下當(dāng)byte num = 120的時(shí)候推導(dǎo)過程。

通過byte強(qiáng)制轉(zhuǎn)換成int 好像一切都很順利,也沒有int強(qiáng)制轉(zhuǎn)換成byte相關(guān)的問題。
當(dāng)真的是那樣嗎?下一篇我們繼續(xù)探討這個(gè)話題。

原文鏈接 http://segmentfault.com/a/1190000003758605/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64539.html

相關(guān)文章

  • java運(yùn)算字節(jié)編碼(二)

    摘要:雖然發(fā)生了符號(hào)位擴(kuò)展,但是沒有任何問題。這就是計(jì)算機(jī)中原碼和補(bǔ)碼的奧秘之處。不過等你看懂了就會(huì)發(fā)現(xiàn)位運(yùn)算的巧妙之處。這個(gè)函數(shù)的作用呢其實(shí)就是計(jì)算整形變量高位連續(xù)為零的個(gè)數(shù)。比如時(shí)二進(jìn)制補(bǔ)碼就是原碼也就是,那么得到的結(jié)果應(yīng)該是。 上一篇文章我們討論到byte強(qiáng)制轉(zhuǎn)換成int。然后拋出了一個(gè)問題,就是byte直接強(qiáng)制轉(zhuǎn)換成int一定會(huì)沒問題嗎?還是因?yàn)樯厦嫖覀兺茖?dǎo)的那個(gè)例子只是個(gè)特例。好吧...

    jerry 評(píng)論0 收藏0
  • Java編程基礎(chǔ)02——Java語(yǔ)言基礎(chǔ)

    摘要:所以就想把一大串縮短點(diǎn),將二進(jìn)制中的三位用一位表示。以可以大寫也可以小寫開頭版本可以表示二進(jìn)制了八進(jìn)制的數(shù)據(jù)表現(xiàn)形式由組成。結(jié)果把系數(shù)基數(shù)的權(quán)次冪相加即可。因?yàn)檎Z(yǔ)言采用的是碼來編碼的。 1_(常量的概述和使用)* A:什么是常量(constant) 在程序執(zhí)行的過程中其值不可以發(fā)生改變 B:Java中常量的分類 字面值常量 自定義常量(面向?qū)ο蟛糠种v) C:字面值常量的...

    pakolagij 評(píng)論0 收藏0
  • Java各種數(shù)據(jù)類型,自己學(xué)習(xí)寫的筆記?。?!

    摘要:局部變量聲明在函數(shù)內(nèi)部的變量。在作用域范圍內(nèi)不能出現(xiàn)命名沖突。 java編程規(guī)范: 1.良好的標(biāo)識(shí)符的命名 保留字不能作為標(biāo)識(shí)符命名: class、public、static..., goto,const 區(qū)分大小寫:helloWorld、HelloWorld 2.良好的注釋習(xí)慣 3.良好的縮進(jìn):沒遇到一個(gè)代碼塊縮進(jìn)一次(一個(gè)tab鍵) 變量:代...

    stefanieliang 評(píng)論0 收藏0
  • python第

    摘要:解釋器的種類的官方版本,使用語(yǔ)言實(shí)現(xiàn),使用最為廣泛,實(shí)現(xiàn)會(huì)將源文件文件轉(zhuǎn)換成字節(jié)碼文件文件,然后運(yùn)行在虛擬機(jī)上。與類似特殊實(shí)現(xiàn)的,將的字節(jié)碼字節(jié)碼再編譯成機(jī)器碼。用于跳出當(dāng)前循環(huán),繼續(xù)下一次循環(huán)。 python介紹 python的用途 我們?yōu)槭裁磳W(xué)習(xí)python,python學(xué)會(huì)了可以做什么,從一個(gè)例子告訴我們學(xué)習(xí)一門編程語(yǔ)言的好處。如:公雞5文錢一只,母雞3文錢一只,小雞3只一文錢,...

    邱勇 評(píng)論0 收藏0
  • killBase系列 -- 密碼學(xué)(

    摘要:系列密碼學(xué)二傳送門密碼學(xué)一基礎(chǔ)密碼學(xué)算法分類消息編碼消息摘要類,類,對(duì)稱密碼非對(duì)稱密碼數(shù)字簽名五元組明文原始信息。非對(duì)稱密碼包提供給,,等非對(duì)稱加密算法。對(duì)稱加密算法在分布式網(wǎng)絡(luò)系統(tǒng)上使用較為困難,主要是因?yàn)槊荑€管理困難,使用成本較高。 前言 最近一場(chǎng)面試,面試官問了我 對(duì)稱加密與非對(duì)稱加密的問題,雖然曾經(jīng)看過一些內(nèi)容,但是沒有系統(tǒng)的整理,所以當(dāng)被問的時(shí)候,腦子里一片空白,沒有回答上...

    tomato 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<