国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

關(guān)于二進制表示和補碼計算

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-07-01 09:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

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

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

CPU 是如何表示負數(shù)的?

為什么補碼可以用來表示負數(shù)?

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

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

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

PS: 這里有點高調(diào)了,最終的所以然部分,應(yīng)該涉及到數(shù)學(xué)證明這一層次了,本文并不會涉及到求證過程。

二、從十進制到二進制

1. 十進制

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

我們來快速復(fù)習(xí)一下關(guān)于十進制運算的一些基本知識:

每一個數(shù)位上包括的數(shù)字為 0 到 9;

每一個數(shù)位上的數(shù),是它右側(cè)數(shù)位的 10 倍;

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

具體來看就是:

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

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

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

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

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

a1b47460-f8d4-11ec-ba43-dac502259ad0.png

十進制數(shù)據(jù),也稱作基于十的表示法。

2. 二進制

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

每一個數(shù)位上包括的數(shù)字為 0 和 1;

每一個數(shù)位上的數(shù),是它右側(cè)數(shù)位的 2 倍;

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

具體來看就是:

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

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

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

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

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

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

二進制的數(shù),使用后綴字母 B 來表示,例如:二進制的 1111B 這個數(shù)字,用圖來表示權(quán)重如下:

a1d4d426-f8d4-11ec-ba43-dac502259ad0.png

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

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

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

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

3. 擴展到十六進制

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

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

每一個數(shù)位上的數(shù),是它右側(cè)數(shù)位的 16 倍;

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

具體來看就是:

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

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

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

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

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

十六進制數(shù)據(jù),使用后綴字母 H 來表示,有些場合也可以使用前綴 0x 來表示,本質(zhì)上沒有區(qū)別。例如:十六進制數(shù)字 1A2BH(或者寫作 0x1A2B),每一個數(shù)位上的權(quán)重如圖:

a1ff3f40-f8d4-11ec-ba43-dac502259ad0.png

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

4. 擴展到任意進制

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

每一個數(shù)位上包括的數(shù)字為 0 到 4;

每一個數(shù)位上的數(shù),是它右側(cè)數(shù)位的 5 倍;

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

具體來看就是:

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

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

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

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

再看一個圖加深印象:

a25ede1e-f8d4-11ec-ba43-dac502259ad0.png

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

1. 十進制加法

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

兩個數(shù),相同數(shù)位上的數(shù)字進行相加;

每一個數(shù)位上的相加結(jié)果,滿十進一;

例如:

a2e23b88-f8d4-11ec-ba43-dac502259ad0.png

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

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

百位上:1 加上進位 1,結(jié)果是 2。

2. 二進制加法

a322a40c-f8d4-11ec-ba43-dac502259ad0.png

第 0 位:0 + 0 結(jié)果為 0;

第 1 位:1 + 0 結(jié)果為 1;

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

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

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

3. 十六進制加法

a346deda-f8d4-11ec-ba43-dac502259ad0.png

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

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

四、把負數(shù)計算轉(zhuǎn)換成正數(shù)計算

1. 原碼

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

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

2. 把負數(shù)計算變成正數(shù)計算

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

a3745ae0-f8d4-11ec-ba43-dac502259ad0.png

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

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

正數(shù)的反碼:保持原碼不變;

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

于是 5 + (-8)的計算過程就是:

a3da2780-f8d4-11ec-ba43-dac502259ad0.png

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

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

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

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

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

有沒有發(fā)現(xiàn)問題:怎么存在 +0 和 -0 這兩個數(shù)?而且他們的編碼還不一樣:+0 對應(yīng) 0000_0000,-0 對應(yīng) 1111_1111。

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

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

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

a429072e-f8d4-11ec-ba43-dac502259ad0.png

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

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

既然每一個二進制表示的值發(fā)生了變化,那么繼續(xù)稱之為反碼就不準確了,此時給它們一個新的稱呼:補碼,也就是說:上圖就變成了這樣:

a4872c14-f8d4-11ec-ba43-dac502259ad0.png

小結(jié)一下補碼的定義:

正數(shù)的補碼:保持原碼不變;

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

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

4. 補碼的計算

我們先看一下這個問題:假設(shè)現(xiàn)在時間是 1 點整,但是你的手表進水了,它顯示的是 3 點整,現(xiàn)在你怎么把時間調(diào)整到 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,...

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

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

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

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

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

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

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

(1) 利用同余數(shù)來計算

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

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

(2) 直接用補碼來計算

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

a4c62f86-f8d4-11ec-ba43-dac502259ad0.png

結(jié)果也是 1,也就是說:

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

細心的讀者可能已經(jīng)發(fā)現(xiàn)了:-2 的二進制補碼表示,與 254 的二進制自然表示,它們的形式是一樣的!

這種“天然”性,是巧合?還是計算機前輩的設(shè)計結(jié)果?!

五、總結(jié)

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

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

謝謝!

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11277

    瀏覽量

    224956
  • 二進制
    +關(guān)注

    關(guān)注

    2

    文章

    809

    瀏覽量

    43029
  • 計算機系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    292

    瀏覽量

    25288

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    CDx4HC283與CDx4HCT283:4位二進制全加器的技術(shù)解析與應(yīng)用指南

    CDx4HC283與CDx4HCT283:4位二進制全加器的技術(shù)解析與應(yīng)用指南 在數(shù)字電路設(shè)計領(lǐng)域,加法器是實現(xiàn)數(shù)值運算的基礎(chǔ)元件之一。今天我們要深入探討的CDx4HC283和CDx4HCT283
    的頭像 發(fā)表于 01-30 17:20 ?642次閱讀

    德州儀器4位二進制全加器:SN54/74系列的技術(shù)剖析

    德州儀器4位二進制全加器:SN54/74系列的技術(shù)剖析 在數(shù)字電路設(shè)計中,加法器是實現(xiàn)算術(shù)運算的基礎(chǔ)組件。德州儀器的SN54283、SN54LS283、SN54S283、SN74283
    的頭像 發(fā)表于 01-28 17:05 ?472次閱讀

    探索CD54/74AC283與CD54/74ACT283:高效4位二進制加法器的奧秘

    探索CD54/74AC283與CD54/74ACT283:高效4位二進制加法器的奧秘 在電子設(shè)計領(lǐng)域,加法器是實現(xiàn)數(shù)字運算的基礎(chǔ)元件之一。今天,我們將深入研究德州儀器(Texas
    的頭像 發(fā)表于 01-28 16:50 ?428次閱讀

    CDx4HC283和CDx4HCT283:高速CMOS邏輯4位二進制全加器的詳細解析

    CDx4HC283和CDx4HCT283:高速CMOS邏輯4位二進制全加器的詳細解析 在電子設(shè)計領(lǐng)域,加法器是數(shù)字電路中最基本的運算單元之一,用于實現(xiàn)二進制數(shù)的加法運算。今天要給大家介紹
    的頭像 發(fā)表于 01-19 14:50 ?315次閱讀

    解析CD54/74AC283與CD54/74ACT283:4位二進制加法器的卓越之選

    解析CD54/74AC283與CD54/74ACT283:4位二進制加法器的卓越之選 在電子設(shè)計領(lǐng)域,加法器是實現(xiàn)數(shù)字運算的基礎(chǔ)組件。今天我們要深入探討的是德州儀器(Texas
    的頭像 發(fā)表于 01-08 16:55 ?574次閱讀

    深入剖析CD54/74AC283與CD54/74ACT283:高性能4位二進制加法器

    深入剖析CD54/74AC283與CD54/74ACT283:高性能4位二進制加法器 在電子設(shè)計領(lǐng)域,加法器是一種基礎(chǔ)且關(guān)鍵的組件。今天,我們將詳細探討CD54/74AC283和CD54
    的頭像 發(fā)表于 01-04 17:25 ?707次閱讀

    CD54/74AC283與CD54/74ACT283:高性能4位二進制加法器的全面解析

    CD54/74AC283與CD54/74ACT283:高性能4位二進制加法器的全面解析 在電子設(shè)計領(lǐng)域,加法器是一種基礎(chǔ)且關(guān)鍵的數(shù)字電路,廣泛應(yīng)用于各種計算和數(shù)據(jù)處理系統(tǒng)中。今天,我們要深入探討
    的頭像 發(fā)表于 12-31 17:10 ?1398次閱讀

    SN54F283與SN74F283:4位二進制全加器的技術(shù)剖析

    SN54F283與SN74F283:4位二進制全加器的技術(shù)剖析 在數(shù)字電路設(shè)計中,加法器是最基礎(chǔ)且關(guān)鍵的組件之一。今天我們要深入探討的是德州儀器(TI)的SN54F283和SN74F283這兩款4位
    的頭像 發(fā)表于 12-29 16:20 ?526次閱讀

    德州儀器4位二進制全加器:SN54/74283系列深度解析

    德州儀器4位二進制全加器:SN54/74283系列深度解析 在數(shù)字電路設(shè)計領(lǐng)域,加法器是構(gòu)建復(fù)雜算術(shù)邏輯單元的基礎(chǔ)組件。德州儀器(TI)的SN54/74283系列4位二進制全加器憑借其快速進位
    的頭像 發(fā)表于 12-23 15:45 ?551次閱讀

    二進制查找(Binary Search)介紹

    二進制查找(Binary Search)用于在已排序的數(shù)組中執(zhí)行二進制查找的函數(shù)。 int binary_search(int arr[], int size, int target
    發(fā)表于 12-12 06:54

    C語言位操作符

    位都為 1 時,它才會給出 1 的裁決,否則就是 0。例如,對 5(二進制表示為 0000 0101)和 3(二進制表示為 0000 0011)進行按位與操作時,0000 01010000 0011
    發(fā)表于 11-21 07:52

    如何將圖像文件轉(zhuǎn)換為二進制文件?

    如何將圖像文件轉(zhuǎn)換為二進制文件
    發(fā)表于 09-05 08:28

    二進制數(shù)據(jù)處理方法分享

    時,我們?nèi)绾稳ソ馕鰯?shù)據(jù)并且應(yīng)用它們。本次的技術(shù)分享文章,我們就從如何傳輸數(shù)據(jù)和解析二進制數(shù)據(jù)來一步一步剝絲抽繭,搞清楚他的運作原理和二進制數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
    的頭像 發(fā)表于 07-30 15:41 ?2416次閱讀
    <b class='flag-5'>二進制</b>數(shù)據(jù)處理方法分享

    如何使用Keil將二進制文件加載到外部SPI Flash中?

    我想知道是否有辦法使用 Keil 將隨機二進制文件加載到外部 SPI 閃存中。二進制文件將通過 LPC54102(OM13077 EVK 板)。我知道一些用于 FPGA 的 ISE 允許您執(zhí)行此作
    發(fā)表于 03-17 06:37

    無法使用密度化參數(shù)構(gòu)建OpenVINO?二進制,怎么處理?

    無法使用密度化參數(shù)構(gòu)建OpenVINO?二進制
    發(fā)表于 03-06 06:51