计算机基础- -计算机为什么要使用二进制
計算機基礎- -計算機為什么要使用二進制
文章目錄
- 計算機基礎- -計算機為什么要使用二進制
- 一、為什么用二進制表示
- 二、什么是二進制數
- 三、移位運算和乘除的關系
- 四、便于計算機處理的補數
- 五、算數右移和邏輯右移的區別
- 六、邏輯運算的竅門
我們都知道,計算機的底層都是使用二進制數據進行數據流傳輸的,那么為什么會使用二進制表示計算機呢?
或者說,什么是二進制數呢?在拓展一步,如何使用二進制進行加減乘除?二進制數如何表示負數呢?
一、為什么用二進制表示
我們大家知道,計算機內部是由IC電子元件組成的,其中CPU和內存也是IC電子元件的一種。
CPU和內存圖如下:
- CPU和內存使用IC電子元件作為基本單元, IC電子元件有不同種形狀, 但是其內部的組成單元稱為一個個的引腳。
- 有人說CPU和內存內部都是超大規模集成電路, 其實IC就是集成電路(Integrated Circuit) 。
- IC元件兩側排列的四方形塊就是引腳,IC的所有引腳,只有兩種電壓:0V和5V,IC的這種特性,也就決定了計算機的信息處理只能用0和1表示,也就是二進制來處理。
- 一個引腳可以表示一個0或1,所以二進制的表示方式就變成0、1、10、11、100、101等,雖然二進制數并不是專門為引腳來設計的,但是和IC引腳的特性非常吻合。
- 計算機的最小集成單位為位, 也就是比特(bit) , 二進制數的位數一般為8位、16位、32位、64位, 也就是8的倍數,為什么要跟8扯上關系呢?
- 因為在計算機中,把8位二進制數稱為一個字節, 一個字節有8位, 也就是由8個bit構成。
- 為什么1個字節等于8位呢? 👏因為8位能夠涵蓋所有的字符編碼👏。
- 字節是最基本的計量單位,位是最小單位。
- 用字節處理數據時,如果數字小于存儲數據的字節數(=二進制的位數),那么高位就用0填補(高位和數學的數字表示是一樣的,左側表示高位,右側表示低位)。
- 比如這個六位數用二進制數來表示就是100111,只有6位,高位需要用0填充,填充完后是00100111,占一個字節,如果用16位表示就是0000000000100111占用兩個字節。
- 我們一般口述的32位和64位的計算機一般就指的是處理位數,32位一次可以表示4個字節,64位一次可以表示8個字節的二進制數。
- 我們一般在軟件開發中用十進制數表示的邏輯運算等,也會被計算機轉換為二進制數處理。對于二進制數,計算機不會區分他是圖片、音頻文件還是數字,這些都是一些數據的結合體。
二、什么是二進制數
- 那么什么是二進制數呢?為了說明這個問題,我們先把00100111這個數轉換為十進制數看一下
- 二進制數轉換為十進制數,直接將各位置上的值*位權即可,那么我們將上面的數值進行轉換
- 也就是說,二進制數代表的00100111轉換成十進制就是39,這個39并不是3和9兩個數字連著寫,而是3*10+9*1,這里面的10,1就是位權
- 以此類推,上述例子中的位權從高位到低位依次就是76543210。這個位權也叫做次冪,那么最高位就是2的7次冪,2的6次冪等等。
- 二進制數的運算每次都會以2為底,這個2指得就是基數,那么十進制數的基數也就是10。
- 在任何情況下位權的值都是數的位數-1,那么第一位的位權就是1-1=0,第二位的位權就睡2-1=1,以此類推。
- 那么我們所說的二進制數其實就是用0和1兩個數字來表示的數,它的基數為2,它的數值就是每個數的位數 * 位權再求和得到的結果,我們一般來說數值指的就是十進制數,那么它的數值就是310+91=39.
三、移位運算和乘除的關系
- 在了解過二進制之后,下面我們來看一下二進制的運算,和十進制數一樣,加減乘除也適用于二進制數,只要注意逢2進位即可。
- 二進制數的運算,也是計算機程序所特有的運算,因此了解二進制的運算是必須要掌握的。
- 首先我們來介紹移位運算,移位運算是指將二進制的數值的各個位置上的元素坐左移和右移操作
見下圖:
- 上述例子中還是以39為例,我們先把十進制的39轉換為二進制的00100111,然后向左移位<<一個字節,也就變成了01001110,那么再把此二進制數轉換為十進制數就是上面的78,也就是十進制的78竟然是十進制39的2倍關系。
- 我們在讓00100111左移兩位,也就是10011100,得出來的值是156,相當于擴大了四倍!
- 因此你可以得出來此結論,左移相當于是數值擴大的操作,那么右移>>呢?
- 按理說右移應該是縮小1/2, 1/4倍,但是39縮小二倍和四倍不就變成小數了嗎?這個怎么表示呢?
四、便于計算機處理的補數
- 剛才我們沒有介紹右移的情況,是因為右移之后空出來的高位數值,有0和1兩種形式。
- 要想區分什么時候補0什么時候補1,首先就需要掌握二進制數表示負數的方法。
- 二進制數中表示負數值時,一般會把最高位作為符號來使用,因此我們把這個最高位當作符號位。
- 符號位是0時表示正數,是1時表示負數。那么-1用二進制數該如何表示呢?
- 可能很多人會這么認為: 因為1的二進制數是00000001,最高位是符號位,所以正確的表示-1應該是10000001,但是這個答案真的對嗎?
- 計算機世界中是沒有減法的,計算機在做減法的時候其實就是在做加法,也就是用加法來實現的減法運算。
- 比如100-50,其實計算機來看的時候應該是100+(-50),為此,在表示負數的時候就要用到二進制補數,補數就是用正數來表示的負數。
- 為了獲得補數,我們需要將二進制的各數位的數值全部取反,然后再將結果+1即可
- 具體來說,就是需要先獲取某個數值的二進制數,然后對二進制數的每一位做取反操作(0--->1,1--->0),最后再對取反后的數+1,這樣就完成了補數的獲取。
- 補數的獲取,雖然直觀上不易理解,但是邏輯上卻非常嚴謹,比如我們來看一下1-1的這個過程,我們先不求補數,直接用上面的這個10000001(假設它是1的補數)來表示一下
- 奇怪,1-1會變成130,而不是0,所以可以得出結論10000001表示-1是完全錯誤的。
- 那么正確的該如何表示呢?其實我們上面已經給出結果了,那就是11111111,來論證一下它的正確性
- 我們可以看到1-1其實實際上就是1+(-1),對-1進行上面的取反+1后變11111111,然后與1進行加法運算,得到的結果是九位的100000000。
- 結果發生了溢出,計算機會直接忽略掉溢出位,也就是直接拋掉最高位1,變為
00000000。也就是0,結果正確,所以11111111表示的就是-1。 - 所以負數的二進制表示就是先求其補數(補數的求解過程就是對原始數值的二進制數各位取反),然后將結果+1
- 當然,結果不為0的運算同樣也可以通過補數求得正確的結果。
- 不過,有一點需要注意,當運算結果為負的時候,計算結果的值也是以補數的形式出現的
比如3-5這個運算,來看一下解析過程:
- 3-5的運算,我們按著上面的思路來過一遍,計算出來的結果是11111110,我們知道,這個數值肯定表示負數,但是負數無法直接用十進制表示,需要對其取反+1,算出來的結果是2,因為11111110的高位是1,所以最終的結果是-2。
- 編程語言的數據類型中,有的可以處理負數,有的不可以。比如C語言中不能處理負數的unsigned short類型, 也有能處理負數的short類型, 都是兩個字節的變量, 它們都有2的十六次冪種值,但是取值范圍不一樣, short類型的取值范圍是-32768-32767,unsigned short的取值范圍是0-65536。
- 仔細思考一下補數的機制,就能明白-32768比32767多一個數的原因了,最高位是0的正數有0~32767共32768個,其中包括0。最高位是1的負數,有-1~-32768共32768個,其中不包含0。
- 0雖然既不是正數也不是負數,但是考慮到其符號位,就將其歸為了正數。
五、算數右移和邏輯右移的區別
- 在了解完補數后,我們重新考慮一下右移這個議題,右移在移位后空出來的最高位有兩種情況0和1。
- 當二進制數的值表示圖形模式而非數值時,移位后需要在最高位補O,類似于霓虹燈向右平移的效果,這就被稱為邏輯右移
- 將二進制數作為帶符號的數值進行右移運算時,移位后需要在最高位填充移位前符號位的值(0或1),這就被稱為算數右移。
- 如果數值使用補數表示的負數值,那么右移后在空出來的最高位補1,就可以正確的表示 1/2,1/4,1/8等的數值運算。
- 如果是正數,那么直接在空出來的位置補0即可。
下面來看一個右移的例子。將-4右移兩位,來各自看一下移位示意圖
-
如上圖所示,在邏輯右移的情況下,-4右移兩位會變成63,顯然不是它的1/4,所以不能使用邏輯右移,那么算數右移的情況下,右移兩位會變為-1,顯然是它的1/4,故而采用算數右移。
-
那么我們可以得出來一個結論:左移時,無論是圖形還是數值,移位后,只需要將低位補0即可;右移時,需要根據情況判斷是邏輯右移還是算數右移。
-
下面介紹一下符號擴展:將數據進行符號擴展是為了產生一個位數加倍、但數值大小不變的節果,以滿足有些指令對操作數位數的要求,例如倍長于除數的被除數,再如將數據位數加長以減少計算過程中的誤差。
-
以8位二進制為例,符號擴展就是指在保持值不變的前提下將其轉換成為16位和32位的二進制數。
-
將01111111這個正的8位二進制數轉換成為16位二進制數時,很容易就能夠得出0000000001111111這個正確的結果,
-
但是像11111111這樣的補數來表示的數值,該如何處理?直接將其表示成為1111111111111111就可以了。
-
也就是說,不管正數還是補數表示的負數,只需要將0和1填充高位即可。
六、邏輯運算的竅門
- 掌握邏輯和運算的區別是:將二進制數表示的信息作為四則運算的數值來處理就是算數,像圖形那樣,將數值處理為單純的0和1的羅列就是邏輯
- 計算機能夠處理的運算,大體可分為邏輯運算和算數運算,算數運算指的是加減乘除四則運算;
- 邏輯運算指的是對二進制各個數位的0和1分別進行處理的運算, 包括邏輯非(NOT運算) 、邏輯與(AND運算) 、邏輯或(OR運算) 和邏輯異或(X OR運算) 四種。
邏輯非指的是將0變成1,1變成0的取反操作
邏輯與 指的是”兩個都是1時,運算結果才是1,其他情況下是O”
邏輯或指的是”至少有一方是1時,運算結果為1,其他情況下運算結果都是0”
邏輯異或指的是“其中一方是1,另一方是0時運算結果才是1,其他情況下是0”
- 掌握邏輯運算的竅門,就是要摒棄二進制數表示數值這一個想法。不要把二進制數表示的值當作數值, 應該把它看成是開關上的ON/OFF。
總結
以上是生活随笔為你收集整理的计算机基础- -计算机为什么要使用二进制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机基础--认识CPU
- 下一篇: 绝不重新定义继承而来的缺省值参数