中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為什么一個byte的存儲范圍是-128~127?

發布時間:2020-07-23 20:47:11 來源:網絡 閱讀:162 作者:王鐸魚ssss 欄目:編程語言

為什么一個byte的存儲范圍是-128~127?
文本關鍵字:byte、字節、二進制位、反碼、補碼
文章目錄
為什么一個byte的存儲范圍是-128~127?

一、byte

二、反碼與補碼

**1. 反碼

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

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

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

正數的補碼 = 原碼 = 反碼
負數的補碼 = 反碼 + 1
那么首先什么是原碼呢?很簡單,在我們不考慮符號的情況下,按照進制的轉換方法將一個十進制數轉換為二進制數,再添加上相應的符號位就完成了。符號位出現在最前(左)面一位,0代表正數,1代表負數。

+3 -> 11 -> 根據符號和byte長度補全:0000 0011
-5 -> 101 -> 根據符號和byte長度補全:1000 0101
那么為什么會提出反碼和補碼的概念呢?有兩個原因:

1. 反碼
保證在二進制下能夠正常的進行正負數間的運算。

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

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

2. 補碼
+0和-0的沖突問題。

從相反數的概念我們可以知道,一個正數肯定存在一個與之對應的相反數,對于整數來說我們只要直接改變一下符號位就行了。But!這個0就很特殊,有一個耳熟能詳的概念:0的相反數還是0,這會直接導致進制的轉換不是一一對應的關系了。

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

-2 -> 原碼:1000 0010 -> 反碼:1111 1101 -> 補碼:1111 1110
-126 -> 原碼:1111 1110 -> 反碼:1000 0001 -> 補碼:1000 0010
補碼運算結果:1000 0000(該類數字沒有原碼和反碼)
到此我們該敲個黑板,劃個重點了:在內存中都是使用補碼來進行計算的(整數類型)!

三、byte的數據范圍
明確了上面幾個概念,那么byte的范圍應該就很清楚了。

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

象山县| 平顺县| 吉隆县| 曲周县| 华亭县| 重庆市| 江陵县| 阿勒泰市| 荆门市| 白城市| 崇仁县| 布拖县| 滕州市| 绥江县| 黄骅市| 班戈县| 台前县| 开平市| 施秉县| 谷城县| 庐江县| 陇西县| 阿瓦提县| 昌平区| 寿光市| 沈阳市| 准格尔旗| 张家界市| 邵阳市| 乌什县| 阳朔县| 长岛县| 历史| 石台县| 崇阳县| 仁化县| 通许县| 尚志市| 新巴尔虎右旗| 长春市| 武强县|