精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于二進制表示和補碼計算的來龍去脈

FPGA之家 ? 來源:道哥分享 ? 作者:道哥分享 ? 2021-06-07 14:30 ? 次閱讀

一、前言

計算機最喜歡的數字就是 0 和 1,在 CPU 的世界中,它只認識這兩個數字,即使是強大的操作系統,也都是由 0 和 1 組成的。

作為一名軟件開發者,入門學習的內容可能就是認識這 2 個既簡單、又強大的數字。但是大部分人,對于二進制、二進制計算、原碼、反碼以及補碼的認識,仍處于機械的強制記憶階段。尤其是對一些編碼和計算,仍然處于模糊的認識階段,例如:

CPU 是如何表示負數的?

為什么補碼可以用來表示負數?

一個 8 位的二進制數,最小值為什么是 -128,而不是 -127?

CPU 中的加法器,為什么可以連同符號位一起運算?

這篇文章我們就來聊聊這個最最基礎的內容,幫助你來理解二進制計算的相關內容,看完這篇文章之后,不僅知其然,更能知其所以然!

PS: 這里有點高調了,最終的所以然部分,應該涉及到數學證明這一層次了,本文并不會涉及到求證過程。

二、從十進制到二進制1. 十進制

作為數學計算能力強大的中國,10 以內的加減法,應該是在幼兒園階段就完成了。如果你不屬于這個范圍,說明你上的是假幼兒園。

我們來快速復習一下關于十進制運算的一些基本知識:

每一個數位上包括的數字為 0 到 9;

每一個數位上的數,是它右側數位的 10 倍;

兩個數相加時,相同數位上的數相加之和如果大于等于 10,就向前進 1 位,即:滿十進一;

具體來看就是:

從右數第一個位數(個位)上的數字代表多少個 1;

從右數第二個位數(十位)上的數字代表多少個 10;

從右數第三個位數(百位)上的數字代表多少個 100;

從右數第四個位數(千位)上的數字代表多少個 1000;

十進制的數,可以使用后綴字母 D 來表示,也可以省略。例如:十進制的 1234 這個數字,個位上的數是 4, 十位上的數是 3, 百位上的數是 2,千位上的數是 1(一般是從最右側的個位說起),每一個數位上的數比它右側大十倍。

十進制數據,也稱作基于十的表示法。

2. 二進制

那么對于二進制呢?直接套用上面十進制的概念,然后把 10 換成 2 即可(目前先忽略符號位):

每一個數位上包括的數字為 0 和 1;

每一個數位上的數,是它右側數位的 2 倍;

兩個數相加時,相同數位上的數相加之和如果大于等于 2,就向前進 1 位,即:滿二進一;

具體來看就是:

從右數第一個位數上的數字代表多少個 1;

從右數第二個位數上的數字代表多少個 2;

從右數第三個位數上的數字代表多少個 4;

從右數第四個位數上的數字代表多少個 8;

記住幾個重點:二進制數中只包含 0 和 1 兩個數字,在相加時滿二進一。

在十進制中,每一個數位我們給它進行了專門的命名(個位、十位、百位。。。),但是二進制沒有類似的命名。

二進制的數,使用后綴字母 B 來表示,例如:二進制的 1111B 這個數字。

換算成十進制數就是 15(1 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 15)。

在二進制中,每一位稱為一個比特(bit),如果用 8 個 bit 來表示一個二進制數,最小值是 0000_00000,最大值是 1111_1111;

如果用 16 個 bit 來表示一個二進制數,最小值是 0000_0000_0000_0000,最大值是 1111_1111_1111_1111。(為了便于觀察,每 4 個 bit 之間,加上了分隔符)

在早期的計算機中,8 位的處理器很常見,于是就給它一個專門的名字:字節(Byte)。16 位的二進制數就是 2 個字節,也稱作:字(Word)。

3. 擴展到十六進制

原理還是相同的:直接把十進制中的 10 換成 16 即可:

每一個數位上包括的數字為 0 到 9,A 到 F;

每一個數位上的數,是它右側數位的 16 倍;

兩個數相加時,相同數位上的數相加之和如果大于等于 16,就向前進 1 位,即:滿十六進一;

具體來看就是:

從右數第一個位數上的數字代表多少個 1;

從右數第二個位數上的數字代表多少個 16;

從右數第三個位數上的數字代表多少個 256;

從右數第四個位數上的數字代表多少個 4096;

在十六進制中,需要十六個數字來表示 0 到 15 這些數字,0 到 9 比較好處理,但是從 10 到 15,我們就需要找一些記號來表示,于是人們就想到用 A,B,C,D,E,F 這幾個字母來分別表示 10 到 15 這個 6 個數字。

十六進制數據,使用后綴字母 H 來表示,有些場合也可以使用前綴 0x 來表示,本質上沒有區別。例如:十六進制數字 1A2BH(或者寫作 0x1A2B)。

換算成十進制數就是 6699(1 * 4096 + 10 * 256 + 2 * 16 + 11 * 1 = 6699)。

4. 擴展到任意進制

原理仍然相同:直接把十進制中的 10 換成目標進制,例如 5 進制:

每一個數位上包括的數字為 0 到 4;

每一個數位上的數,是它右側數位的 5 倍;

兩個數相加時,相同數位上的數相加之和如果大于等于 5,就向前進 1 位,即:滿五進一;

具體來看就是:

從右數第一個位數上的數字代表多少個 1;

從右數第二個位數上的數字代表多少個 5;

從右數第三個位數上的數字代表多少個 25;

從右數第四個位數上的數字代表多少個 125;

三、從十進制加法到二進制加法1. 十進制加法

這個就不必多說了,規則只有 2 條:

兩個數,相同數位上的數字進行相加;

每一個數位上的相加結果,滿十進一;

個位上:4 + 8,結果是 12,但是十進制中沒有 12 這個數字,因此向左側的高位進1,個位就剩下:12 - 10 = 2。

十位上:7 + 2,再加上進位 1,結果是 10,但是十進制中沒有 10 這個數字,因此向左側的高位進1,十位變成:10 - 10 = 0。

百位上:1 加上進位 1,結果是 2。

2. 二進制加法

第 0 位:0 + 0 結果為 0;

第 1 位:1 + 0 結果為 1;

第 2 位:1 + 1 結果為 2,但是二進制中沒有 2 這個數字,因此需要向左側的高位進 1,于是第 2 位上就剩下 2 - 2 = 0。

第 3 位:1 + 1 等于 2,再加上進位 1,結果就是 3,但是二進制中沒有 3 這個數字,因此需要向左側的高位進 1,于是第 3 位上就剩下 3 - 2 = 1。

第 4,5,6,7位計算均是如此。

3. 十六進制加法

第 0 位:E + C,結果為 26,但是十六進制中沒有 26 這個數字,因此需要向左側的高位進 1,于是第 0 位就剩下 26 - 16 = A。

第 1 位:A + 1 等于 B,再加上進位 1,結果就是 C,十六機制中有這個數字。

四、把負數計算轉換成正數計算1. 原碼

原碼(true form)是一種計算機中對數字的二進制定點表示方法。原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其余位表示數值的大小。

例如,用 8 個 bit (8 位二進制數)來表示一個數,+11 的原碼為 0000_1011,-11 的原碼就是 1000_1011。

2. 把負數計算變成正數計算

我們都知道,CPU 中有加法器,好像從來沒有聽說過“減法器”。例如計算 5 + 8,轉換成二進制來計算:

再來計算一下減法:5 - 8,對于 CPU 來說,只會計算 5 + 8, 但是不會計算 5 - 8。

但是可以轉換一下思路,把減法變成加法 5 + (-8),這樣不就可以計算了嗎?于是計算機先驅者就發明了反碼:

正數的反碼:保持原碼不變;

負數的反碼:原碼中符號位不變,其余全部取反(-8 的原碼是 1000_1000,反碼就是:1111_0111);

此時,就完美解決了減法問題,那么乘法(多加幾次)、除法(多減幾次)問題也就跟著解決了。至于如何從數學的角度來證明,那就要問那些數學家了!

3. 新問題:如何表示0?

我們現在可以小結一下反碼的表示范圍(記住:第一位是符號位):

正數的表示范圍:0000_0000 ~ 0111_1111,也就是十進制的 +0 ~ +127 這 128 個數;

負數的表示范圍:1000_0000 ~ 1111_1111,也就是十進制的 -127 ~ -0 這 128 個數;

有沒有發現問題:怎么存在 +0 和 -0 這兩個數?而且他們的編碼還不一樣:+0 對應 0000_0000,-0 對應 1111_1111。

CPU 雖然就是一個傻瓜,讓它干啥就干啥,但是 CPU 最不能容忍的就是不確定性!我們都知道 +0 == -0 == 0,它們是同一個數字,但是在二進制編碼中,居然有兩個編碼來表示同一個數。

偉大的計算機先驅者又做了這樣一個決定:正數保持不變,負數整體減 1。

也就是說:符號位不變,值整體加1。

這樣就成功解決了 -0、+0 的問題!

現在 一個 8 位的二進制就可以表示的范圍是:-128 ~ 127,并且中間沒有任何重復、遺漏的數字。

既然每一個二進制表示的值發生了變化,那么繼續稱之為反碼就不準確了,此時給它們一個新的稱呼:補碼。

小結一下補碼的定義:

正數的補碼:保持原碼不變;

負數的補碼:原碼中符號位不變,其余先全部取反,然后再加1(例如:-8 的原碼是 1000_1000,補碼就是 1111_1000);

此時,我們僅僅是解決了二級制編碼的表示問題,那么:補碼能直接參與運算嗎?運算結果會出現什么問題?

4. 補碼的計算

我們先看一下這個問題:假設現在時間是 1 點整,但是你的手表進水了,它顯示的是 3 點整,現在你怎么把時間調整到 1 點的位置?

方法1:把時針逆時針撥動 2 個小時(3 - 2 = 1);

方法2:把時針順時針撥動 9 個小時到 12 點,然后再撥動 1 個小時(3 + 10 = 1);

對于時鐘表盤來說,每 12 個小時為一圈,可以認為:-2 == 10,-1 = 11, -3 = 9,同樣的:-2 == 10, -2 == 22, -2 == 34,。。。

可以看到規律是:-2、10、22、34 這些數字對 12 取模都得到同一個數(取正數),在數學上,兩個整數除以“同一個整數”,若得相同余數,則這兩個整數同余。

表盤中的 12 就是這個“同一個整數”,可以看到這是一個可“溢出”的系統,-2、10、22、34 這幾個數在表盤上表示的是一樣的數,所以說這幾個整數同余。

也就是說:在計算的時候,可以用 10、22、34 這幾個數字來替換 -2,替換之后的計算結果是相同的。

那么對于一個 8 位 的二進制數來說,最多只有 8 位,在計算過程中,如果最高位產生了進位,就會被丟棄,所以它也是一個可“溢出”的系統。那么這里的“同一個整數”是多少呢?

從前面的內容中可以看到,使用補碼表示的 8 位二進制數表示的范圍是 -128 ~ 127,一共是 256 個數,所以如果對 256 取模,得到相同的余數,那么這些數就是同余數。

例如:-2 和 254 對 256 取模,得到相同的余數,因此它倆就是同余數,那么在計算的時候,就可以用 254 來代替 -2。

那么我們通過計算 3 + (-2) 來驗證一下。

(1) 利用同余數來計算

3 + (-2) == 3 + 254 = 257

257 超過了最大的表示范圍,所以溢出,結果就是 257 對 256 取模,結果為 1。

(2) 直接用補碼來計算

3 的補碼是 0000_0011,-2 的補碼是 1111_1110,在計算的時候,把符號位也參與運算:

結果也是 1,也就是說:

在二進制計算中,使用補碼來計算,“天然”就滿足了“同余定理”。

細心的讀者可能已經發現了:-2 的二進制補碼表示,與 254 的二進制自然表示,它們的形式是一樣的!

這種“天然”性,是巧合?還是計算機前輩的設計結果?!

五、總結這篇文章,我們探討了計算機系統的軟件基石:二進制系統,主要的目的是幫助你理解二進制的表示、計算方式。

希望你看完之后能夠豁然開朗!如果對您的理解有幫助的話,請轉發給身邊的技術小伙伴,共同成長!

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10829

    瀏覽量

    211183
  • 計算機
    +關注

    關注

    19

    文章

    7430

    瀏覽量

    87733
  • 加法器
    +關注

    關注

    6

    文章

    183

    瀏覽量

    30093
  • 補碼
    +關注

    關注

    0

    文章

    14

    瀏覽量

    7541

原文標題:關于二進制表示和補碼計算的來龍去脈,入門看了秒懂

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    hex格式和二進制的區別

    HEX格式和二進制在多個方面存在顯著的區別。以下是對這兩者的對比: 一、定義與表示方式 HEX格式 : HEX,全稱為Intel HEX,是一種用于存儲和傳輸數據到嵌入式系統(如單片機)的文件格式
    的頭像 發表于 11-18 15:24 ?289次閱讀

    為什么Gain=1對應的默認值不是16位二進制補碼的中間數而是最小數?

    根據Gain Calibration中的描述,滿量程校準碼采用二進制補碼;Gain=1對應8000h;gain=2對應7FFFh;gain=0對應0000h。但是對于二進制補碼而言,
    發表于 11-18 08:12

    ASCII碼和二進制的轉換關系

    是一種計數系統,使用0和1兩個數字來表示信息。在計算機科學中,二進制是非常重要的,因為計算機的硬件層面上處理的就是二進制
    的頭像 發表于 11-10 09:50 ?590次閱讀

    二進制編碼器工作原理 如何選擇二進制編碼器

    編碼器通常有多個輸入端(通常為2的n次方個,其中n是編碼器的位數),和一個或多個輸出端。每個輸入端對應一個二進制位,而輸出端則表示輸入的二進制值。 優先編碼器 : 優先編碼器是一種特殊的二進制
    的頭像 發表于 11-06 09:44 ?330次閱讀

    二進制補碼及與原碼的互相轉換方法

    大沙把一些基礎的知識說清楚,本文介紹二進制補碼及與原碼的轉換方法。 先說原碼,原碼?是一種計算機中對數字的二進制定點表示方法。在原碼
    的頭像 發表于 09-19 22:25 ?390次閱讀

    計算機采用二進制的原因不包括什么

    ,我們先簡要回顧一下為什么計算機會采用二進制。 物理實現的簡便性 :計算機的硬件,如晶體管,可以用兩種穩定狀態來表示信息,通常是0和1,這對應于二進
    的頭像 發表于 09-04 17:03 ?451次閱讀

    二進制處理中的一些技巧

    二進制和十進制的處理中,有時候一些小技巧是很有用的。 1、把十進制數轉換成二進制數 (1)在MATLAB中有一個函數dec2bin,可以把正整數轉換為2
    的頭像 發表于 07-05 11:51 ?525次閱讀

    二進制串行計數器工作原理是什么?

    在數字電路設計中,計數器是一種非常關鍵的組件,用于測量時間、計數事件或跟蹤狀態變化等。其中,二進制串行計數器作為一種常用的計數器類型,在多種應用場景中都發揮著重要作用。本文將對二進制串行計數器
    的頭像 發表于 05-28 15:52 ?765次閱讀

    如何實現二進制和BCD碼數據的相互轉變?

    如何實現二進制和BCD碼數據的相互轉變? 二進制碼是將十進制數字表示二進制數和十進制數的一種表示
    的頭像 發表于 02-18 14:51 ?3319次閱讀

    二進制與邏輯電平的變化范圍

    二進制中的兩個數字0和1稱為位(bit, 是二進制數字binary digit的縮寫)。在數字電路中,使用兩個不同的電平表示這兩個位。一般情況下,1 用高電平表示,0用低電平
    的頭像 發表于 02-04 16:54 ?1247次閱讀
    <b class='flag-5'>二進制</b>與邏輯電平的變化范圍

    鴻蒙二進制數組創建

    背景 c++層數據都是二進制,需要轉換成arrayBuffer透傳到ets層給業務使用,但是鴻蒙的使用下面兩個api創建出來的二進制數組數據都是錯誤的。 接口
    的頭像 發表于 01-31 15:24 ?1224次閱讀

    二進制、八進制、十六進制在現實當中有什么意義?

    二進制、八進制、十六進制在現實當中有什么意義? 二進制、八進制和十六進制在現實生活中有著廣泛的應
    的頭像 發表于 01-16 11:14 ?5128次閱讀

    10進制轉換為二進制的算法

    進制轉換為二進制計算機科學中非常基礎且重要的概念之一。在理解和應用計算機科學的基礎知識時,掌握這個算法是至關重要的。 在開始講解十進制
    的頭像 發表于 01-15 10:32 ?3052次閱讀

    10進制轉換為二進制的算法

    10進制轉換為二進制計算機領域中非常重要的一個問題。在計算機中,所有的數據都是以二進制形式進行存儲和處理的。因此,我們常常需要將10
    的頭像 發表于 01-11 09:14 ?2256次閱讀

    AD9957的二進制補碼的小數點位置如何確定?

    您好!我正使用AD9957的QUDC模式,現通過DSP給AD9957送入并行數據。我的問題是,數據手冊說施加于引D<17:0>的數據字可以選擇二進制補碼編碼格式,那么請問這18位的二進制
    發表于 12-25 07:55