-
1 # 袁世滔
-
2 # IT全棧工程師
機器數/機器碼
我們都知道,計算機底層採用二進位制進行運算,其實,並沒有這麼簡單,這個問題涉及到了計算機的組成原理,原碼、補碼、反碼和移碼,也稱為機器數或者機器碼。
對於0,在原碼機器中往往有“+0”和“-0”之分,故有兩種表現形式:
[+0] = 0000...0(0位符號位)
[ -0] = 1000...0(1位符號位)
這種方式進行加減法運算,相當複雜。當兩數相加時,如果同號,則數值相加;如果是異號,則要進行減法。而在進行減法時,還要比較兩個數絕對值得大小,然後大數減去小數,最後還要給結果選擇恰當的符號。為了解決這個問題,人們想到了補碼錶示法。
補碼、反碼採用補碼錶示法進行減法運算,比原碼方便很多。因為不論正負,機器總是在做加法,減法運算可以變成加法運算。根據定義,求負數的補碼還要進行減法運算,這顯然不合理,於是,人們又想到了反碼錶示法。
對於一個正數,它用原碼、反碼和補碼錶示方法完全一樣,符號位固定為0,用而進製表示的數位值都一樣。
對於一個負數,它用原碼、反碼和補碼錶示時,符號位固定為1,二進位制表示的數位值都不一樣:
原碼符號位為1不變,整數的每一位二進位制位數取反,得到 反碼
反碼符號位為1不變,反碼數值位最低位加1,得到 補碼
例如:[x]原=01111010 [x]反=0111010 [x]補=0111010
[x]原=11111010 [x]反=1000101 [x]補=1000110
補碼加法、減法加法公式:[x]補+[y]補=[x+y]補 (正數的補碼和原碼是一樣的)
減法公式:[x-y]補=[x]補-[y]補=[x]補+[-y]補
看題為主,請忽略字寫得醜!!!!
結束語當然,計算機二進位制運算不止這些,還有溢位、原碼並行乘法。陣列乘法等等。
兩個正數相加,結果大於機器字長所能表示的最大正數,即正溢。
兩個負數相加,結果小於機器所能表示的最小負數,稱為負溢
備註:定檢機器中,書的範圍|x|<(2的n次方-1)
-
3 # 教育技術匯
我們都知道CPU是由許多電晶體組成的。透過改變電晶體的開關來表示二進位制數,那麼它是如何的呢?
某個指令系統的指令長度為32位,操作碼長度為八位,地址長度也是八位,而且第一條指令是加,第二條指令是減。當他收到一個000000100000010000000010000110的掀起出他先取出它的前八位操作碼,即00000010,分析得出這是一個減法操作。有三個地址,分別是兩個原運算元00000100出起初00000100出,起初被,00000100處取出被減數,到00000001處取出減數,ai修正,進行減法運算,然後把結果送到00000110處。
-
4 # 程式設計老大叔
想要知道計算機怎麼進行數字運算,就需要了解計算機的儲存原理。
大家都知道計算機只認識0和1,但是0和1對人又不友好,怎麼做到這兩者的轉換呢?計算器又是怎麼對資料進行運算的呢?這就需要從計算機的儲存講起。
位和位元組位:來自英文bit,音譯為“位元”,表示二進位制位。位是計算機內部資料儲存的最小單位,11010100是一個8位二進位制數。
位元組:來自英文Byte,音譯為“拜特”,習慣上用大寫的“B”表示。位元組是計算機中資料處理的基本單位。計算機中以位元組為單位儲存和解釋資訊,規定一個位元組由八個二進位制位構成,即1個位元組等於8個位元(1Byte=8bit)。八位二進位制數最小為00000000,最大為11111111;通常1個位元組可以存入一個ASCII碼,2個位元組可以存放一個漢字國標碼。
unsigned int、signed int和unsinged char 、signed char
一般來說char型別變數在計算機記憶體裡佔用1個位元組,也就是8個位元(byte),unsinged就是無符號的意思,signed就是有符號的意思。char預設是unsinged型別
如果是unsinged char那麼最高位(最左邊)就可以用來表示數字,那麼char能表示的範圍是二進位制的00000000~11111111,轉換為十進位制就是0~255。
如果是signed char那麼最高位(最左邊)就需要用來表示正負0為正,1為負,那麼只有剩餘7位能表示數字,所以能表示的範圍就是1111 1111~01111111 ,轉換位十進位制就是 - 127~ +127。還有一個 1000 0000 用它來表示 -128,因為沒有負0的概念。計算機裡負數都是用補碼來表示。關於補碼的概念後面會講。
unsigned int和signed int在char的基礎上理解,只不過int是四個位元組,也就是4*8=32位。int預設是signed有符號位的。所以,unsigned int表示的範圍是:0~2的32次方-1。signed int表示的範圍是:-2的31次方~2的31次方-1。
原碼、反碼、補碼要了解清楚原碼、反碼、補碼需要先了解兩個額外的概念:機器數和真值
機器數:一個數在計算機中的二進位制表示形式, 叫做這個數的機器數。機器數是帶符號的比如,十進位制中的數 +3 ,計算機字長為8位,轉換成二進位制就是00000011。如果是 -3 ,就是 10000011 。這裡的 00000011 和 10000011 就是機器數。
真值:拿上面的機器數00000011(十進位制+3)來講,其形式值131(又二進位制轉10進製得來),但是實際我們要的是+3,所以我們需要去掉最高位符號位:0000 0001的真值 = +000 0011 = +3,1000 0001的真值 = –000 0011 = –3。
瞭解了上面兩個概念,我們就可以來看原碼、反碼、補碼了
原碼:顧名思義,原碼就是我原來要表示的值的二進位制碼,所以+3/-3的原碼是需要考慮符號位的:+3的原碼是:0000 0011。-3的原碼是:1000 0011。
反碼:
正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反
+3 原碼是:0000 0011 反碼是:0000 0011
-3 原碼是:1000 0011 反碼是:1111 1100
補碼:
正數的補碼就是其本身
即在反碼的基礎上+1
+3 原碼是:0000 0011 反碼是:0000 0011 補碼是:0000 0011
-3 原碼是:1000 0011 反碼是:1111 1100 補碼是:1111 1101
為什麼要存在這麼多種碼
看完上面的內容,大家一定很懵,為什麼要弄這麼多碼。這是因為計算機是不辨別"符號位",因為這顯然會讓計算機的基礎電路設計變得十分複雜! 於是人們想出了將符號位也參與運算的方法。
計算機減法運算我們知道, 根據運演算法則減去一個正數等於加上一個負數, 即: 1-1 = 1 + (-1) = 0 , 所以計算器只有加法而沒有減法, 這樣計算機運算的設計就更簡單了。
在加減乘除中,正數當然很好處理,如果遇到負數就會有問題,我們來看一下-3-(-3)如果用原碼運算會怎麼樣:
在計算機中只有加法,所以3-(3) =3+(-3);
0000 0011+1000 0011=10000110,我們算上符號轉為十進位制是:-6;
既然原碼不行,那用反碼?好,試一下看看
0000 0011+1111 1100 = 111111111,我們算上符號轉為十進位制是:-127;
那再試試補碼
0000 0011+1111 1101 = 00000000;我們算上符號轉為十進位制是:0;
OK,是對的;
總結所以計算機運算是以補碼運算的,並且計算機只有加法,兩個數相減最終會透過加法與數字本身的正負來實現
-
5 # 使用者95719088360
二進位制減法的運算是透過做在最高位補碼借一當二的方式實現的。其它和普通數值計算沒什麼太大區別 比如說 00011110 -00011100 =00000010
也就是 30-28=2
但是有時會出現負數運算,比如28-30
00011100-0001110這個時候就會出現借位,這樣的話就要做借位取反操作。
回覆列表
科學家們利用電路的開啟和斷開實現了1和0的兩種模式進行二進位制演算法,在計算機中採用的二進位制加法進位運算很容易理解,那二進位制減法該怎麼辦呢,其實二進位制減法也是透過二進位制加法來進行實現的。我們知道在十進位制當中a-b=a+(-b),其中b為正數,-b就稱作負數,即相當於減一個數就等於加他的相反數,其實二進位制減法也是用這種方式。
十進位制裡表示一個負數,在這個數前面加一個負號即可,但是二進位制裡你怎麼加個負號呢,又怎麼表示一個負數呢?我們知道在十進位制中一個數加一個他的相反數會等於零,例如 b+(-b)=0,比如十進位制 1的二進位制是0000001,要使一個數加 00000001 後等於 0,那這個數就是1的二進位制相反數,這裡叫補數。
------------------------------------------------------------------------------------
00000001 + ???????? =00000000 求出這個?數是11111111 , 這個數也就是0000001的相反數,二進位制中稱作補數。
------------------------------------------------------------------------------------
那我們怎麼求出二進位制中的補數呢?只要把要轉換的數每一位取反,就是把0就換成1,1就換成0,比如 00000001 取反變成 11111110 , 取反後再加1 變成11111111 ,這樣就全部變成00000000了,就可以求出一個數的補數了。
我們規定最高位為符號位,在這個符號位放1就表示是負整數,符號位放0就表示是正整數
比如前面的 11111111 最高位是1,那麼這個數就是負數,只不過刨去符號位,剩下的數不能直接轉成正數,而是要取反加1,比如 剛剛的 1111111 去掉符號位,還剩7個1,111111 = 127 這樣算剛剛的數就變成 -127了,這麼算是錯的,我們要按取反的方法來推出負數,在透過符號位判斷出這個數是負數後,取反加1即可。
如果 1111111 既可以表示十進位制的 256 又可以表示成十進位制的 -1 ,那麼計算機怎麼知道這個是正數還是負數呢,所以給計算機這串數值時,我們要先定義一下變數型別,這也就是為什麼我們在C語言裡定義變數要給定變數型別的原因。