為什麼乙個位元組的補碼表示範圍是 128 127

2021-08-28 06:44:10 字數 1181 閱讀 9964

我們要先區分一下原碼、反碼和補碼的表示規則:

0的表示:

原碼:有正零和負零之分,[+0]補=0000 0000,[-0]補=1000 0000;

反碼:同樣有兩種表示方法,[+0]反=0000 0000 ,[-0]反=1111 1111;

補碼:零只有一種表示方法,不分正負,[0]補=0000 0000;

8為二進位制表示的範圍為:

乙個位元組8位,如果採用原碼表示正整數(含0),可以表達0-255,即 2^8=256,一共256種狀態,從全0到全1的各種排列組合。如果要表示負數,則符號位需要占用一位(最高位,1代表負數,0代表正數),因此其絕對值最大範圍為0-127,即2^7=128,一共正負各128種狀態,如果不採用特殊處理,這時候0占用2個編碼(10000000和00000000),資料表示範圍為-127到-0及+0到127,這樣總體上乙個位元組只有255種狀態,因為其中0具有正0和負0之分,這不符合數學意義也浪費乙個編碼。

除了以上的弊端,還有個原因是,早期硬體很昂貴,一位或者乙個編碼的浪費都是不可饒恕的,因此人們想到了另一種編碼把負0利用起來,即當遇到負數時,採用補碼來表示就可以解決這個問題,而遇到正數或0時還是保留原碼表示。因此這個負0通過補碼演算法處理後自然而然地被利用起來,用來表示-128.

補碼的演算法為:絕對值的原碼各位取反後加1.

例1:負1的補碼:

絕對值的8位原碼為00000001

取反:11111110

加1 :11111111

此時最高位被處理為1,滿足高位為1代表負數的定義。

例2:負128的補碼:

絕對值的8位原碼為10000000

取反:01111111

加1 :10000000

此時同樣的最高位被置為1,同樣滿足高位為1代表負數的定義,同時原先表示負0的編碼被利用起來表示-128。

因此乙個位元組的有符號整數範圍為-128到127。

綜上為:

原碼+反碼:8位原碼和反碼能夠表示數的範圍是-127~127;

補碼:8位補碼能夠表示數的範圍是 -128~127。

(在補碼中用(-128)代替了(-0),所以補碼的表示範圍為:(-128~0~127)共256個)

int為什麼佔4個位元組?乙個位元組為什麼是8位?

不知道大家有沒有思考過這樣的問題,乙個位元組為什麼是8位呀,也許還有小夥伴不知道我說的這些是什麼,沒關係往下看。第乙個解釋 歷史 是ibm為system 360設計了一套8位ebcdic編碼,涵蓋了數字 大小寫字母和大部分常用符號,同時又相容廣泛用於打孔卡的6位bcdic編碼。第二個解釋,二進位制我...

計算機中,為什麼乙個位元組是8位?

說這個問題的時候,首先提一下ascii編碼作為切入比較容易理解一點 ascii編碼 全稱american standard code for information interchange,翻譯過來就是美國資訊交換標準碼。ascii編碼作用 就是編碼,那什麼又是編碼?我個人理解編碼就跟江湖中的好漢劫...

為什麼C語言中bool型變數占用乙個位元組

c99標準新增bool型資料,占用乙個位元組,不滿8bit的部分 可能 會填0對齊。1.效率 cpu 一下子就能處理 32bit or 64bit的資料,所以直接填滿了來處理,這樣可能效率更高。比如說,有的目標平台處理雙位元組的速度比單位元組要快,於是很多單位元組資料型別就可以用自定義乙個雙位元組型...