摘要:正數(shù)的原碼,反碼和補(bǔ)碼相同。變量原碼反碼是符號位不變,其他位取反反碼補(bǔ)碼則是在反碼的基礎(chǔ)上加補(bǔ)碼所以在計算機(jī)中正確的表示應(yīng)該是。原碼反碼補(bǔ)碼此刻開始轉(zhuǎn)換為類型,占個字節(jié),符號位,用填充高位三個字節(jié)。
我們都知道計算機(jī)存儲的是二進(jìn)制,長度是8個比特。
byte b = 10; int i = -10; long l = 10L;
那么以上幾個變量如何用二進(jìn)制表示呢?
很多人第一印象肯定是 b變量占用一個字節(jié),也就是8位,所以 b用二進(jìn)制表示就是 1010,高位補(bǔ)零,所以是 00001010。那么i是int,占用4個字節(jié),也就是32位,但因為是負(fù)數(shù),所以最高位是100000000 00000000 00000000 00001010。同理 l變量則是 00000000 00000000 00000000 00000000 000000000 00000000 00000000 00001010。
上面的推理過程中存在一處錯誤,就是在java中存儲的是補(bǔ)碼,而不是原碼。正數(shù)的原碼,反碼和補(bǔ)碼相同。負(fù)數(shù)則不是一樣。以上面 int i = -10 作為例子。
變量 i 原碼 1000 1010 # 反碼是符號位不變,其他位取反 反碼 1111 0101 #補(bǔ)碼則是在反碼的基礎(chǔ)上加1 補(bǔ)碼 1111 0110
所以-10 在計算機(jī)中正確的表示應(yīng)該是 1111 0110。
上面我們已經(jīng)學(xué)習(xí)原碼,反碼和補(bǔ)碼相關(guān)的概念,至于為什么要用補(bǔ)碼,感興趣的可以自己去查。
我們也知道在網(wǎng)絡(luò)傳輸中,存儲的就是二進(jìn)制相關(guān)的byte數(shù)組。那么現(xiàn)在我們需要往消息中寫入int或者long相關(guān)的信息,如何轉(zhuǎn)換為byte數(shù)組中的相關(guān)項?第一個想到的辦法就是強(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個字節(jié),而byte占用1個字節(jié),同時你也看到 -135已經(jīng)超出了一個字節(jié)所能表示的范圍[-128, 127]。如果強(qiáng)制轉(zhuǎn)換后還能顯示出正確結(jié)果,那才恐怖啊。
-135 原碼 10000000 00000000 00000000 10000111 反碼 11111111 11111111 11111111 01111000 補(bǔ)碼 11111111 11111111 11111111 01111001
我們知道java中存儲的是補(bǔ)碼,可是因為byte只占一個字節(jié),所以轉(zhuǎn)換的時候只取到最低位那個字節(jié)也就是 01111001作為轉(zhuǎn)換后補(bǔ)碼存在。因為正數(shù)的原碼和補(bǔ)碼相同,也即是這個字節(jié)的原碼是01111001,原值是 121。
剛才我們討論的是int強(qiáng)制轉(zhuǎn)換成byte類型可能存在的問題。那么如果我需要把byte類型的強(qiáng)制轉(zhuǎn)換成int類型的會出現(xiàn)什么樣的問題。
byte num = 120; System.out.println((int)num); num = -120; System.out.println((int)num);
大家看到這兩行示例代碼時。盡量自己嘗試推導(dǎo)出結(jié)果來,不要看我下面的推導(dǎo)過程。
我們以-120作為例子,嘗試推導(dǎo)下(看到?jīng)]有,我喜歡負(fù)數(shù))。
-120 原碼 11111000 反碼 10000111 補(bǔ)碼 10001000 ##此刻開始轉(zhuǎn)換為int類型,占4個字節(jié),符號位1,用1填充高位三個字節(jié)。如果符號位是0,高位會用0填充。 補(bǔ)碼 11111111 11111111 11111111 10001000 /** 存儲在內(nèi)存中的int整形補(bǔ)碼 **/ 反碼 11111111 11111111 11111111 10000111 原碼 10000000 00000000 00000000 01111000 原值 -120
所以 當(dāng) byte num = -120 時, (int)num = -120
我相信很多人都沒有自己推導(dǎo),直接看我的推導(dǎo)的。那么再給你個機(jī)會,嘗試推導(dǎo)下當(dāng)byte num = 120的時候推導(dǎo)過程。
通過byte強(qiáng)制轉(zhuǎn)換成int 好像一切都很順利,也沒有int強(qiáng)制轉(zhuǎn)換成byte相關(guān)的問題。
當(dāng)真的是那樣嗎?下一篇我們繼續(xù)探討這個話題。
原文鏈接 http://segmentfault.com/a/1190000003758605/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/64539.html
摘要:雖然發(fā)生了符號位擴(kuò)展,但是沒有任何問題。這就是計算機(jī)中原碼和補(bǔ)碼的奧秘之處。不過等你看懂了就會發(fā)現(xiàn)位運算的巧妙之處。這個函數(shù)的作用呢其實就是計算整形變量高位連續(xù)為零的個數(shù)。比如時二進(jìn)制補(bǔ)碼就是原碼也就是,那么得到的結(jié)果應(yīng)該是。 上一篇文章我們討論到byte強(qiáng)制轉(zhuǎn)換成int。然后拋出了一個問題,就是byte直接強(qiáng)制轉(zhuǎn)換成int一定會沒問題嗎?還是因為上面我們推導(dǎo)的那個例子只是個特例。好吧...
摘要:所以就想把一大串縮短點,將二進(jìn)制中的三位用一位表示。以可以大寫也可以小寫開頭版本可以表示二進(jìn)制了八進(jìn)制的數(shù)據(jù)表現(xiàn)形式由組成。結(jié)果把系數(shù)基數(shù)的權(quán)次冪相加即可。因為語言采用的是碼來編碼的。 1_(常量的概述和使用)* A:什么是常量(constant) 在程序執(zhí)行的過程中其值不可以發(fā)生改變 B:Java中常量的分類 字面值常量 自定義常量(面向?qū)ο蟛糠种v) C:字面值常量的...
摘要:局部變量聲明在函數(shù)內(nèi)部的變量。在作用域范圍內(nèi)不能出現(xiàn)命名沖突。 java編程規(guī)范: 1.良好的標(biāo)識符的命名 保留字不能作為標(biāo)識符命名: class、public、static..., goto,const 區(qū)分大小寫:helloWorld、HelloWorld 2.良好的注釋習(xí)慣 3.良好的縮進(jìn):沒遇到一個代碼塊縮進(jìn)一次(一個tab鍵) 變量:代...
摘要:解釋器的種類的官方版本,使用語言實現(xiàn),使用最為廣泛,實現(xiàn)會將源文件文件轉(zhuǎn)換成字節(jié)碼文件文件,然后運行在虛擬機(jī)上。與類似特殊實現(xiàn)的,將的字節(jié)碼字節(jié)碼再編譯成機(jī)器碼。用于跳出當(dāng)前循環(huán),繼續(xù)下一次循環(huán)。 python介紹 python的用途 我們?yōu)槭裁磳W(xué)習(xí)python,python學(xué)會了可以做什么,從一個例子告訴我們學(xué)習(xí)一門編程語言的好處。如:公雞5文錢一只,母雞3文錢一只,小雞3只一文錢,...
摘要:系列密碼學(xué)二傳送門密碼學(xué)一基礎(chǔ)密碼學(xué)算法分類消息編碼消息摘要類,類,對稱密碼非對稱密碼數(shù)字簽名五元組明文原始信息。非對稱密碼包提供給,,等非對稱加密算法。對稱加密算法在分布式網(wǎng)絡(luò)系統(tǒng)上使用較為困難,主要是因為密鑰管理困難,使用成本較高。 前言 最近一場面試,面試官問了我 對稱加密與非對稱加密的問題,雖然曾經(jīng)看過一些內(nèi)容,但是沒有系統(tǒng)的整理,所以當(dāng)被問的時候,腦子里一片空白,沒有回答上...
閱讀 2399·2021-08-26 14:14
閱讀 2731·2019-08-29 13:07
閱讀 2142·2019-08-26 11:44
閱讀 734·2019-08-26 10:11
閱讀 2474·2019-08-23 15:43
閱讀 3144·2019-08-23 14:17
閱讀 455·2019-08-23 12:36
閱讀 2280·2019-08-22 15:20