溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

為什么一個(gè)byte的存儲(chǔ)范圍是-128~127?

發(fā)布時(shí)間:2020-07-23 20:47:11 來源:網(wǎng)絡(luò) 閱讀:153 作者:王鐸魚ssss 欄目:編程語言

為什么一個(gè)byte的存儲(chǔ)范圍是-128~127?
文本關(guān)鍵字:byte、字節(jié)、二進(jìn)制位、反碼、補(bǔ)碼
文章目錄
為什么一個(gè)byte的存儲(chǔ)范圍是-128~127?

一、byte

二、反碼與補(bǔ)碼

**1. 反碼

  1. 補(bǔ)碼
    三、byte的數(shù)據(jù)范圍
    一、byte**
    在計(jì)算機(jī)中,一個(gè)二進(jìn)制位是最小的存儲(chǔ)單元,由于是二進(jìn)制,所以能存儲(chǔ)的數(shù)字只能是0和1。顯然,如果我們直接去操作每個(gè)二進(jìn)制位將是很麻煩的過程,所以在編程中我們直接使用的是其他的數(shù)據(jù)類型,如:byte、int、float。這些數(shù)據(jù)類型能夠使我們的數(shù)據(jù)存儲(chǔ)更加方便,我們只需要關(guān)心他們能夠存儲(chǔ)多大范圍和什么樣類型的數(shù)據(jù)就可以了。
    那么一個(gè)byte,也就是我們所說的一字節(jié),他所占用的空間是8個(gè)二進(jìn)制位。

1 byte = 8 bit(比特)
這8個(gè)bit就是8個(gè)二進(jìn)制位,其中有一個(gè)是符號(hào)為,剛好可以用0和1來代表正負(fù)。那么這8個(gè)二進(jìn)制位到底能夠表示多大范圍的數(shù)字呢?對(duì)于正數(shù)的進(jìn)制轉(zhuǎn)換相信難不倒大家,也可以參考底部的相關(guān)文章,我們先來看一下負(fù)數(shù)在二進(jìn)制下是如何表示和轉(zhuǎn)換的。

二、反碼與補(bǔ)碼
首先把公式立在這里:

正數(shù)的補(bǔ)碼 = 原碼 = 反碼
負(fù)數(shù)的補(bǔ)碼 = 反碼 + 1
那么首先什么是原碼呢?很簡(jiǎn)單,在我們不考慮符號(hào)的情況下,按照進(jìn)制的轉(zhuǎn)換方法將一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),再添加上相應(yīng)的符號(hào)位就完成了。符號(hào)位出現(xiàn)在最前(左)面一位,0代表正數(shù),1代表負(fù)數(shù)。

+3 -> 11 -> 根據(jù)符號(hào)和byte長(zhǎng)度補(bǔ)全:0000 0011
-5 -> 101 -> 根據(jù)符號(hào)和byte長(zhǎng)度補(bǔ)全:1000 0101
那么為什么會(huì)提出反碼和補(bǔ)碼的概念呢?有兩個(gè)原因:

1. 反碼
保證在二進(jìn)制下能夠正常的進(jìn)行正負(fù)數(shù)間的運(yùn)算。

首先我們來看一下如果直接使用原碼存儲(chǔ),在進(jìn)行正負(fù)數(shù)運(yùn)算的時(shí)候會(huì)出現(xiàn)什么樣的情況。5+(-3)=2,那么在二進(jìn)制下的運(yùn)算也和十進(jìn)制一樣,直接相加,該進(jìn)位進(jìn)位,但是符號(hào)位沒法直接參與運(yùn)算,換句話說,讓計(jì)算機(jī)直接判斷算式最后的正負(fù)其實(shí)比較困難。
原碼計(jì)算:0000 0011 + 1000 0101 = 1000 1000,結(jié)果是:-8(不需要糾結(jié)最后的符號(hào)位應(yīng)該取什么,因?yàn)樵谟?jì)算機(jī)中并沒有采用這種方法進(jìn)行計(jì)算,只是舉例)。顯然,直接采用原碼計(jì)算的這種方式在正數(shù)下是沒問題的,但是在負(fù)數(shù)時(shí)就不適用了,所以我們需要重新定義一個(gè)規(guī)則對(duì)負(fù)數(shù)進(jìn)行處理。
由于在正數(shù)下計(jì)算是沒問題的,那么就可以規(guī)定:正數(shù)的反碼等于原碼,負(fù)數(shù)的反碼為除去符號(hào)位,其他取反。

+3 -> 原碼:0000 0011 -> 反碼:0000 0011
-5 -> 原碼:1000 0101 -> 反碼:1111 1010
反碼計(jì)算后:1111 1101 -> 原碼:1000 0010 -> 十進(jìn)制:-2。嗯,好像沒什么問題了,但是當(dāng)一個(gè)正數(shù)和一個(gè)負(fù)數(shù)的運(yùn)算結(jié)果為正數(shù)(如:+5和-3,大家可以自己驗(yàn)證)或者恰好為0時(shí)還是會(huì)有問題。

2. 補(bǔ)碼
+0和-0的沖突問題。

從相反數(shù)的概念我們可以知道,一個(gè)正數(shù)肯定存在一個(gè)與之對(duì)應(yīng)的相反數(shù),對(duì)于整數(shù)來說我們只要直接改變一下符號(hào)位就行了。But!這個(gè)0就很特殊,有一個(gè)耳熟能詳?shù)母拍睿?的相反數(shù)還是0,這會(huì)直接導(dǎo)致進(jìn)制的轉(zhuǎn)換不是一一對(duì)應(yīng)的關(guān)系了。

+2 -> 原碼:0000 0010 -> 反碼:0000 0010
-2 -> 原碼:1000 0010 -> 反碼:1111 1101
反碼計(jì)算后:1111 1111 -> 原碼:1000 0000 -> 十進(jìn)制:-0。結(jié)果貌似正確,但是在正數(shù)中:0000 0000也同樣代表0。那么對(duì)于1000 0000,是不能直接被抹去的,那就讓它來代表一個(gè)特殊的數(shù)字吧:-128。
其實(shí),特殊的不只是這一個(gè)數(shù)字,如對(duì)于Java中的short,占用兩個(gè)字節(jié),最高一位為符號(hào)位,那么就會(huì)出現(xiàn)這個(gè)數(shù)字:1000 0000 0000 0000,從原碼上看也是-0,對(duì)于int類型也是一樣,那么這個(gè)問題就可以總結(jié)為:符號(hào)位為1,其他位均為0,我們應(yīng)該怎么處理。
于是,為了解決這一類問題,就有了補(bǔ)碼的概念:負(fù)數(shù)的補(bǔ)碼 = 反碼 + 1。我們用臨界位置的計(jì)算來進(jìn)行舉例,如:(-2)+(-126)=-128。

-2 -> 原碼:1000 0010 -> 反碼:1111 1101 -> 補(bǔ)碼:1111 1110
-126 -> 原碼:1111 1110 -> 反碼:1000 0001 -> 補(bǔ)碼:1000 0010
補(bǔ)碼運(yùn)算結(jié)果:1000 0000(該類數(shù)字沒有原碼和反碼)
到此我們?cè)撉脗€(gè)黑板,劃個(gè)重點(diǎn)了:在內(nèi)存中都是使用補(bǔ)碼來進(jìn)行計(jì)算的(整數(shù)類型)!

三、byte的數(shù)據(jù)范圍
明確了上面幾個(gè)概念,那么byte的范圍應(yīng)該就很清楚了。

最大的正數(shù):0111 1111 -> 2^7 - 1 = 127
最大的負(fù)數(shù):1000 0000 -> -2^7 = -128
對(duì)于其他正數(shù)類型的范圍也是如此:

Java中的short:2字節(jié) -> -2^15 ~ 2^15 - 1
Java中的int:4字節(jié) -> -2^31 ~ 2^31 - 1
Java中的long:8字節(jié) -> -2^63 ~ 2^63 - 1
不同語言定義的數(shù)據(jù)類型在內(nèi)存中占用的字節(jié)數(shù)是不同的,而且也不需要直接記這些范圍,一般來說記字節(jié)就好。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI