原碼,反碼,補碼

2021-08-18 18:18:48 字數 1643 閱讀 5797

計算機中採用二進位制表示乙個整數。這裡我們以八位二進位制數為例,計算機中八位二進位制表示法中有原碼,反碼,補碼。

這三種編碼方式中 ,乙個八位由高到低 7-0 八個位,最高位第八位表示符號位,其他低表示值位,符號位為0表示正整數,符號位為1表示負整數。下面介紹下這三編碼方法。

原碼

正整數:0 ******x

負整數:1 ******x

0可以是+0 :0 0000000

0可以是-0:   1 0000000

反碼:

正整數:和原碼一樣,0 ******x

負整數:和原碼相比,符號位不變位1 值位取反1變0 0變1

例如 -10

原碼:1 0001100

反碼:1 1110011

0的反碼同樣分+0和-0

+0 反碼:0 0000000

-0 反碼:1 1111111

補碼

正整數:和原碼一樣,0 ******x

負整數:在反碼的基礎上+1

例如 -10

原碼:1 0001100

反碼:1 1110011

補碼:1 1110100

0的反碼同樣分+0和-0

+0 補碼:0 0000000

-0 補碼:-0 反碼  +  1  即 1 1111111 + 1 位 1 0 0000000 最高位丟棄 結果位0 0000000

+0 -0 補碼一樣都為0 0000000

在計算中,採用補碼表示非浮點數 這裡的浮點數 就是通常我們說的帶小數 的數  1.2 ,1.33之類的,關於浮點數的編碼我們以後會討論到。

補碼相對原碼和反碼相對難理解下,肯定也有人和我最初一樣疑問計算機為啥採用補碼的方式編碼儲存非浮點數,我們先來驗證下計算機中儲存非浮點數是採用補碼的。下面以c語言**為例子,**編譯執行平台 gcc ubuntu16.04

#include #include #include void printbt(unsigned char uc);	//列印乙個位元8位的補碼

void printbm(int num); //列印乙個32位整數

int main(int argc, char* argv)

const char* numchar = argv[1];

printbm(atoi(numchar)); //atoi 函式將字串轉為32位int整數

return 0;

}void printbt(unsigned char uc)

else

}}void printbm(int num)

else}}

執行結果:

1.原碼和反碼中,+0與-0的表示並不相同,所以計算機中一般使用補碼2.簡化運算設計,利用高位溢位,將減法變為加法運算

3補碼表示負數時可以比原碼反碼多表示乙個最負的負數。補碼 1 0000000 表示 -128

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

數值在計算機中表示形式為機器數 計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的 是十進位制,正如亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手 指頭這個解剖學事實的結果.儘管在歷史上手指計數 5,10進製 的實踐要比二或三進製計數出現的晚.摘...