回去又復習了一遍計算機里面二進制整數的表示方式,主要分為3類:原碼、反碼和補碼。
當然,我還是要在開頭說明一下,計算機里都是以補碼的形式儲存數據。
原碼
這種方式最好理解,將我十進制的“逢十進一”換成二進制的“逢二進一”就行了。
具體如何做呢?還是介紹一下十進制和二進制的轉換方式吧。
-
二進制轉換十進制
話不多說,直接寫公式,“按權展開求和”:

-
十進制轉二進制
按照套路來,用"除2取余,逆序排列"的方法。
舉個栗子:789轉換成二進制
1.除二取余
計算 | 余數 | 位數 |
---|---|---|
789/2=394 | 余1 | 第10位 |
394/2=197 | 余0 | 第9位 |
197/2=98 | 余1 | 第8位 |
98/2=49 | 余0 | 第7位 |
49/2=24 | 余1 | 第6位 |
24/2=12 | 余0 | 第5位 |
12/2=6 | 余0 | 第4位 |
6/2=3 | 余0 | 第3位 |
3/2=1 | 余1 | 第2位 |
1/2得0 | 余1 | 第1位 |
2.逆序排列余數得到結果
789=1100010101(B)
后面括號里的B代表該數為二進制
-
計算機里為什么要用二進制碼來表示數據
1、技術實現簡單。計算機是由邏輯電路組成,邏輯電路通常只有兩種狀態,開關的接通和斷開,正好用“0”“1”表示。
2、運算規則簡單,兩個二進制數的和、積運算組合簡單。
3、適合邏輯運算,二進制只有兩個數碼,和邏輯代數中的“真”“假”相吻合。
4、易於進行轉換,二進制和十進制數轉換簡單。
-----------摘自百度知道
對於原碼,我覺得了解上面的就差不多了。
反碼
顧名思義,反碼其實就是把原碼所有的位數反過來,1->0,0->1
這有什么用?為什么要這么做呢?
在此之前,我們先回答以下幾個事實
- 原碼表示負數很困難
你可以在電腦的很多地方看到負數運算吧?如果整數在計算機里都用原碼來表示,負數怎么運算呢?這將是一個非常困難的話題。如果要達到這種效果,可能需要在硬件(運算器)的設計時,加入特定的記錄和運算負數的功能,但設計到硬件這方面,問題會變得很麻煩,或者假如它被設計出來,最終應用到電腦上時性能也會大大減弱。引入反碼,就是希望能夠通過另一種編碼形式,解決負數表示的問題。說到這你可能還是很疑問為什么這樣反過來就可以表示負數了,不要急,我來逐步解決你的問題,先繼續往下看。 - 4個二進制位能表示的最大整數
你可能會覺得1111(B)就是最大的,按照我們之前在原碼里介紹的方法,把它轉化為十進制:
1111(B) = 15
問題來了,如果我們要表示負數呢?所以我們需要抽出一位來表示正負,也就是第一位,並且規定0為正,1為負(其實這也不能說是規定,它很神奇,事實就是這樣)
既然有這個規定,我們能表示的最大整數就不能是255了,而是:
0111(B) = 7
那最小整數呢?是1111(B) = -7
嗎,錯誤!繼續往下看,了解如何表示負數。
你可能會比較陌生這樣的表示方法,但現在只要你記住有這樣的規定就行。
- 如何用反碼表示整數(包括正負數)
規則:十進制 > 二進制原碼 > 二進制反碼
將十進制的絕對值轉換為二進制原碼,如果該數為整數,則不變(反碼=原碼),若該數為負數,則按位取反,得到反碼。
以下列表列出了0附近的幾個反碼(假如我們使用4個二進制位,表示負數一定要確定有多少個二進制位):
二進制反碼 | 十進制整數 |
---|---|
0101 | 5 |
0100 | 4 |
0011 | 3 |
0010 | 2 |
0001 | 1 |
0000 | 0 |
1111 | 0 |
1110 | -1 |
1101 | -2 |
1100 | -3 |
從上面到下面,其實大部分還是很好理解的,反碼每次-0001得到下面的數(這和十進制是一樣的),但是我們注意到,有兩個0。我們要討論一下為什么0000-1111得到的還是0,其實仔細想想會發現確實是這樣的,因為0可以看作是+0和-0,按照上面的規則,就有兩種表示方法了。
那0000 - 0001 = 1111又是為什么呢?
這是因為溢出了,你可以理解為0000的前面有無數個1,在后一位不夠的時候會向前一位借1(但是這個1是不會還的)。現在討論溢出還早,這個理解起來有點麻煩。
你現在要知道,如何將十進制數轉化為二進制反碼表示,並且知道0可以有兩種方法表示,就行了。
- 一個字節表示的最小整數
觀察二進制反碼的變化,你會發現反碼表示正負數的形式,並不是我們想的那樣:先用原碼表示絕對值,然后前面加一個1或者0讓他變成正或者負。所以這就是為什么之前你認為的“1111(B)是能夠表示的最小整數”這句話是錯的,因為它其實表示的是0。
那如何得到最小整數呢?
我們還是看上面列表里的規律吧,繼續往下走,直到反碼的后3位全部0,即1000(B)(第一位我們不能動,因為如果在此繼續減下去,它將變成一個正數!在實際計算機里也是這樣的),我們反向走一遍規則,將1000(B)轉化為絕對值,就是1000(B) > 0111(B) > 7,因為它是負數,所以是-7,這就是4個二進制位能夠表示的最小整數了。 -
公式法得到反碼
想要用原碼轉換的方法得到一個數的反碼嗎?這樣會讓轉換過程更加通用。看下面的公式:
其中n為二進制位數,N為十進制數的絕對值
假如我們將十進制-6用4個二進制位表示,那么n=4,N=6,公式得到N' = 9,然后用原碼表示9就得到了二進制數:1001,它就是-6的反碼了。
原文地址:https://www.jianshu.com/p/8314710ba093?from=singlemessage