本文基礎知識大部分來自於大學學習的 計算機組成原理,計算機科學技術導論等教材
引論
編程語言中,多數都會由byte類型,那byte類型是一個什麼樣的概念呢,佔用位元組數為1,為什麼值範圍是-128~127呢,帶著這樣的疑問我們進入話題
十進位數 97 和-97對應的二進位 1100001 和 -1100001
在數學中,是將正號“十”和負號“一”放在絕對值前面來表示該數是正數還是負數的。而在計算機中則使用符號位來表示正、負數。符號位規定放在數的最前面,並用“0”表示正數,用“1”表示負數。這樣,數的符號也數碼化了。在計算機中,負數有三種表示方法:原碼、反碼和補碼。任何正數的原碼、補碼和反碼的形式完全相同,而負數則有各種不同的表示形式。為區分起見,將原來用一般形式表示的數X稱為機器數的真值,而將數在計算機內的各種編碼表示稱為機器數,根據表示方法的不同分別記為[X]原、[X]反和[X]補等
在由日常數據轉換為計算機硬體能夠直接識別、處理的機器數時,需要解決三個問題
1. 只能採用二進位數,每位數碼非0即1;
2. 將符號位數字化,如用0表示正號,用1表示負號;
3. 採用什麼編碼方法表示數值。
一、原碼、補碼、反碼
原碼
原碼錶示法約定:讓數碼序列的最高位為符號位,符號位為0表示該數為正,為1表示該數為負;數碼序列的其餘部分為有效數值,用二進位數絕對值表示。
97對應的 原碼:0 1100001 -97對應的原碼:1 1100001
反碼
正數的反碼是其本身(等於原碼);負數的反碼是將原碼中除符號位以外的所有位(數值位)取反,也就是 0 變成 1,1 變成 0
97 的 原碼和反碼都是:0 1100001
-97 的原碼:1 1100001
-97 的反碼:1 0011110
補碼
假設 我們用原碼進行加減法操作,示例 十進位 -2 對應二進位 1 0000010,十進位 3 對應二進位 0 0000011,正數之間是不會有問題的,但負數相加就會出現一些問題
為了克服原碼錶示法在加、減運算中的缺點,引入了補碼錶示法,並以此作為加、減運算的基礎。引入補碼錶示法的目的是:讓符號位也作為數值的一部分直接參与運算,以簡化加、減運算的規則,同時又能化減為加。下面舉個例子說明補碼的思想:
如 時鐘。時鐘以12為一個計數循環,在有模運算中稱為“以12為模”。13點捨去模12後,就是1點。從0點位置出發,沿反時針方向將時針撥動-1格(即-1點),等同於沿順時針方向撥動11格(即11點)。換句話說,在以12為模的前提下,-1可以映射為+11。由此我們得到啟發:在有模運算中,一個負數可以用一個與它互為補碼的正數來代替。
補碼示例
註:數的原碼錶示形式簡單,適合於進行乘除運算,但用原碼錶示的數進行加減運算比較複雜。引入補碼以後,減法運算可以使用加法來實現,且數的符號位也可以當作運算值一樣參加運算,因此在計算機中大都採用補碼來進行加減運算。
二、Byte結構
在絕大多數語言中 Byte結構都是 1位元組 範圍 [-128,127]
這個參考上文講的 機器數 是計算機里存儲的,計算機可以識別的數,所以 Byte 1位元組是8位,可以表示的範圍是 0000 0000 ~ 1111 1111,注意此處存儲的是 原數值的補碼
正數部分:正數的補碼還是自己,即 0000 0000 ~ 0111 1111 表示範圍是 [0,127] ,
負數部分:負數的補碼 是該數的原碼除負號位外各位取反,然後在最後一位加1,
即 1111 1111 ~ 1000 0000 對應的原值 1 0000 0000 ~ 1000 0001 即為 [-128,-1]
注意:其實有的時候很難理解 把 1000 0000 轉換為 -128,這個原因是 高位被截斷,其實他的原碼應該是 1 0000 0000 然後取補碼得到 1000 0000
以下為Java代碼示例
到此這篇關於計算機組成原理之源碼、反碼、補碼詳解及Byte結構的文章就介紹到這了,更多相關源碼、反碼、補碼詳解內容請搜索以前的文章或繼續瀏覽下面的相關文章,希望大家以後多多支持!
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/172243.html