計算機算法中的數字表示法——原碼、反碼、補碼

目錄

  • 1.前言
  • 2.研究數字表示法的意義
  • 3.數字表示法
  • 3.1 無符號整數
  • 3.2 有符號數值
  • 3.3 二進制補碼(Two's Complement, 2C)
  • 3.4 二進制反碼(也稱作 1 的補碼, One's Complement, 1C)
  • 3.5 減 1 表示法(Diminished one System, D1)
  • 3.6 原碼、反碼、補碼總結

1.前言

昨天有粉絲讓我講解下定點數和浮點數,本來這部分是打算在FPGA入門系列的最后面來講的。作者想開的系列真的很多,比如開發FPGA需要學會相關軟件Matlab、Vivado、ModelSim等等的使用,每個軟件做一個系列;FPGA入門教程做一個系列;基礎數字信號處理做一個系列;通信相關的系列;IP核使用詳解系列;FPGA數字積木系列(自己設計的一些參數化IP)。但是這些無疑都會花大量的時間去構思和整理資料,會出的比較慢,請讀者耐心等待。

這篇文章就先介紹定點數和浮點數的概念,因為要真正講清楚還得從原碼、補碼和反碼開始講起。要仔細研究的建議去多看看相關書籍,講清楚原理之后再講Matlab里面計算的浮點數怎么轉換為定點數到FPGA里面進行使用,以及FPGA里面計算的定點數,怎么在Matlab里面又轉換為浮點數。

這里需要重點強調的是,原理雖然很枯燥,但是真的很重要,是絕對不能忽視的,如果原理弄的一知半解,就開始去做處理,后期該踩得坑一個也少不了。

2.研究數字表示法的意義

在計算機算法中,有兩個基本設計準則是非常重要的:分別是數字表示法和代數運算的實現。例如:定點數或浮點數就是常用且可行的數字表示法。一些基本的運算,像加法器和乘法器,更為繁瑣的運算,諸如求平方根和應用CORDIC算法計算角函數的有效實現,都要以可行的數字表示法為基礎實現。
FPGA由于其物理位級編程結構的特點,提供了大量實現數字信號處理算法所需要的計算機算法。這恰好與帶有定點多級累加器內核的可編程數字信號處理器(programmable digital signal processors,PDSP)相反。在FPGA設計中仔細地選擇位寬就能夠從本質上做到節約。

3.數字表示法

在工程的早期階段,必須仔細考慮,確定是使用定點數還是浮點數更適合于解決問題。一般可以認為:定點數的實現具有更高的速度和更低廉的成本;而浮點數則具有更高的動態范圍且不需要換算,這對較為復雜的算法可能更適合。下圖給出了傳統和非傳統定點數和浮點數的數字表示法的一個概觀。兩套系統都由許多各自的標準所覆蓋,當然,如果需要的話也可以以一種專有形式實現。

3.1 無符號整數

X X X 是 一個 N N N 位無符號二進制數, 則其范圍是 [ 0 , 2 N ? 1 ] \left[0,2^N-1\right] [0,2N?1], 表達式如下:
X = ∑ n = 0 N ? 1 x n 2 n X=\sum_{n=0}^{N-1} x_n 2^n X=n=0N?1?xn?2n

其中 x n x_n xn? X X X 的第 n n n 位二進制數字(也就是 x n ∈ [ 0 , 1 ] x_n \in[0,1] xn?[0,1] )。數字 x 0 x_0 x0? 稱作最低有效位(Least Significant Bit, LSB), 具有相當于個位的權重。數字 x N ? 1 x_{N-1} xN?1? 就是最高有效位(Most Significant Bit, MSB), 具有相當于 2 N ? 1 2^{N-1} 2N?1 的權重。

3.2 有符號數值

在有符號數字表示法中, 數字和符號是單獨表示的。第一位代表符號, 余下的 N ? 1 N-1 N?1 位代表數字, 表達式如下:
X = { ∑ n = 0 N ? 1 x n 2 n X ≥ 0 ? ∑ n = 0 N ? 1 x n 2 n X < 0 X= \begin{cases}\sum_{n=0}^{N-1} x_n 2^n & X \geq 0 \\ -\sum_{n=0}^{N-1} x_n 2^n & X<0\end{cases} X={n=0N?1?xn?2n?n=0N?1?xn?2n?X0X<0?

表達式的范圍是 [ ? 2 N ? 1 , 2 N ? 1 ] \left[-2^{N-1}, 2^{N-1}\right] [?2N?1,2N?1], 有符號數字表示法的優點就是簡化了溢出的問題, 但缺點就是加法需要根據哪一個操作數更大來進行區分運算。

3.3 二進制補碼(Two’s Complement, 2C)

有符號整數的 N N N 位二進制補碼表達式如下:
X = { ∑ ∞ ? 0 N ? 1 x n 2 n X ≥ 0 2 k ? ∑ n = 0 1 ? 1 x n 2 n X < 0 X= \begin{cases}\sum_{\infty-0}^{N-1} x_n 2^n & X \geq 0 \\ 2^k-\sum_{n=0}^{1-1} x_n 2^n & X<0\end{cases} X={?0N?1?xn?2n2k?n=01?1?xn?2n?X0X<0?
其范圍是 [ ? 2 N ? 1 , 2 N ? 1 ? 1 ] \left[-2^{N-1}, 2^{N-1}-1\right] [?2N?1,2N?1?1]。目前數字信號處理領域,最常用的就是用二進制補碼來表示有符號數。這是由于它可以累加多個有符號數,且最終結果也在N位范圍內,即可以忽略一切算術上的溢出。

例如,我們計算兩個3位數的差(3-2=?):
3 10 ? 01 1 2 C ? 2 10 ? 11 0 2 C 1 10 ? 1.00 1 2 C \begin{array}{rrr} 3_{10} & \leftrightarrow & 011_{2 C} \\ -2_{10} & \leftrightarrow & 110_{2 C} \\ 1_{10} & \leftrightarrow & 1.001_{2 C} \end{array} 310??210?110??????0112C?1102C?1.0012C??

溢出可以忽略。所有的計算都是取模 2 N 2^N 2N 。這樣就有可能出現不能夠正確表示中間值的情形,但只要最終值有效, 結果就是正確的。例如計算 3 位的數字 2 + 2 ? 3 2+2-3 2+2?3, 會得到一個中間值 010 + 010 = 10 0 2 C 010+010=100_{2 C} 010+010=1002C?, 也就是 ? 4 10 -4_{10} ?410?, 但是結果 100 ? 011 = 100 + 101 = 00 1 2 C 100-011=100+101=001_{2 C} 100?011=100+101=0012C?, 是正確的。

二進制補碼還可以用來實現模 2 N 2^N 2N 的算法, 而且不需要在算法中作任何改動。

3.4 二進制反碼(也稱作 1 的補碼, One’s Complement, 1C)

N N N 位二進制反碼數字表示法可以表示的整數范圍是 [ ? 2 N ? 1 ? 1 , 2 N ? 1 ? 1 ] \left[-2^{N-1}-1,2^{N-1}-1\right] [?2N?1?1,2N?1?1] 。在二進制反碼中,正整數和負整數除了符號位之外具有相同的表示方法。那么“0”就有正的和負的,兩個表達式。二進制反碼中有符號數的標準表達式如下:
X = { ∑ n = 0 N ? 1 x n 2 n X ≥ 0 2 N ? 1 ? ∑ n = 0 N ? 1 x n 2 n X < 0 X= \begin{cases}\sum_{n=0}^{N-1} x_n 2^n & X \geq 0 \\ 2^N-1-\sum_{n=0}^{N-1} x_n 2^n & X<0\end{cases} X={n=0N?1?xn?2n2N?1?n=0N?1?xn?2n?X0X<0?

請看下面的簡單示例:
3 10 ? 0 1 1 1 C ? 2 10 ? 1 0 1 1 C 1 10 ? 1. 0 0 0 1 C 進位 → → → 1 1 C 1 10 ? 0 0 1 1 C \begin{array}{rrrrrr} 3_{10} & \leftrightarrow & & 0 & 1 & 1_{1 C} \\ -2_{10} & \leftrightarrow & & 1 & 0 & 1_{1 C} \\ 1_{10} & \leftrightarrow & 1. & 0 & 0 & 0_{1 C} \\ 進位 & & \rightarrow & \rightarrow & \rightarrow & 1_{1 C} \\ 1_{10} & \leftrightarrow & & 0 & 0 & 1_{1 C} \end{array} 310??210?110?進位110???????1.?0100?1000?11C?11C?01C?11C?11C??
在二進制反碼中需要, “進位問繞(carry wrap-around)” 加法。在最高有效位與最低有效位相加得到正確結果時, 就會出現進位。

盡管如此, 這種數字表示法還走能夠有效地實現模 2 N ? 1 2^N-1 2N?1 運算, 而且不需要校正。因此二進制反碼在實現特定的 DSP 算法(例如: 整數計算不 2 N ? 1 2^N-1 2N?1 的 Mersenne 變換)時, 還是有其特殊價值的。

3.5 減 1 表示法(Diminished one System, D1)

減1表示法是一種有偏移的數學表示法。正整數與二.進制補碼相比減少了 1。 N N N 位 D1數值范圍是 [ ? 2 N ? 1 , 2 N ? 1 ] ( \left[-2^{N-1}, 2^{N-1}\right]( [?2N?1,2N?1]( 不含 0 ) ) ) 。D1 數字表示法的編碼規則定義如下:
X = { ∑ n = 0 A ? 1 x n 2 n ? 1 X ≥ 0 2 N ? ∑ n = 0 N ? 1 x n 2 n X < 0 2 N X = 0 X= \begin{cases}\sum_{n=0}^{A-1} x_n 2^n-1 & X \geq 0 \\ 2^N-\sum_{n=0}^{N-1} x_n 2^n & X<0 \\ 2^N & X=0\end{cases} X=? ? ??n=0A?1?xn?2n?12N?n=0N?1?xn?2n2N?X0X<0X=0?

從下面兩個 D1 數相加可以看到, 對于 D1 而言還必須計算補碼和顛倒進位的加法。
3 10 ? 0 1 0 D 1 ? 2 10 ? 1 1 0 D 1 1 10 ? 1. 0 0 0 D 1 進位 → .?-1 → 0 D 1 1 10 ? 0 0 0 D 1 \begin{array}{rrrrrr} 3_{10} & \leftrightarrow & & 0 & 1 & 0_{D 1} \\ -2_{10} & \leftrightarrow & & 1 & 1 & 0_{D 1} \\ 1_{10} & \leftrightarrow & 1. & 0 & 0 & 0_{D 1} \\ 進位 & & \rightarrow &\fbox{. -1} & \rightarrow & 0_{D 1} \\ 1_{10} & \leftrightarrow & & 0 & 0 & 0_{D 1} \end{array} 310??210?110?進位110???????1.?010.?-1?0?1100?0D1?0D1?0D1?0D1?0D1??
D1 數不需要在算法上作任何改動就能夠有效地實現模 2 N + 1 2^N+1 2N+1 運算。比如可以利用這一結論在 2 N + 1 2^N+1 2N+1 計算環中實現費爾出 NTT(Fermat Network Transfer Table, Fermat 網絡傳輸表)。

3.6 原碼、反碼、補碼總結

上面說了這么多,又是公式又是例子的估計很多人都開始暈了,現在直接總結口訣如下:

對于有符號數而言:

1.二進制的最高位是符號位:0表示正數,1表示負數(口訣0——>0,1——>-)。

2.正數的原碼、反碼、補碼都是一樣的(三碼合一)。

3.負數的反碼 = 它的原碼符號位不變,其他位取反(0——>1,1——>0)。

4.負數的補碼 = 它的反碼 + 1,負數的反碼 = 負數的補碼 - 1。

5.0的反碼、補碼都是0。

6.在計算機運算的時候,都是以補碼的方式來運算的。

7.當我們看運算結果的時候,要看它的原碼。

原碼、反碼、補碼

關注微信公眾號獲取更多資訊:????![在這里插入圖片描述](https://img-

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18991.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手推車式電纜故障定位系統

武漢凱迪正大一體化電纜故障高壓發生器用于測試各種型號的380V,600V,10kV,35kV,110kV,220kV,380kV電壓等級的銅鋁芯電力電纜、同軸通信電纜和市話電纜的各類故障&#xff0c;如電纜全長、開路、短路、斷線、低阻故障、高阻故障、高阻泄露、高低阻抗接地、接地故障、鎧裝接地故障…

工控一體機7寸顯示器電容觸摸屏(YR07JK)產品規格說明書

如果您對工控一體機有任何疑問或需求&#xff0c;或者對如何集成工控一體機到您的業務感興趣&#xff0c;可移步控芯捷科技。 一、硬件功能介紹 1.1 YR07JK介紹 YR07JK工控機是我公司推出的一款新型 Cortex-A17 架構&#xff0c;主頻達1.8GHz、具有高性能低能耗的工業控制板卡…

甩掉接口文檔煩惱!Spring Boot 集成 Knife4j,輕松玩轉 API 可視化

一、引言&#xff1a;跟接口文檔說拜拜 &#x1f44b; 作為一名 Java 開發者&#xff0c;你是否還在為編寫繁瑣的 API 文檔而頭疼&#xff1f;傳統的手動編寫方式不僅耗時費力&#xff0c;而且容易出錯&#xff0c;難以維護。今天&#xff0c;我們就來介紹一款神器 Knife4j&am…

win10雙網卡如何同時上內網和外網?

win10雙網卡如何同時上內網和外網? Chapter1 win10雙網卡如何同時上內網和外網?Chapter2 網絡基礎--win10雙網卡設置成訪問不同的網絡 Chapter1 win10雙網卡如何同時上內網和外網? 原文鏈接&#xff1a;https://www.jb51.net/os/win10/806585.html 場景&#xff1a;很多辦…

【計算機畢業設計】388微信小程序足球賽事及隊伍管理系統

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

QT7_視頻知識點筆記_67_項目練習(頁面以及對話框的切換,自定義數據類型,DB數據庫類的自定義及使用)

視頻項目&#xff1a;7----汽車銷售管理系統&#xff08;登錄&#xff0c;品牌車管理&#xff0c;新車入庫&#xff0c;銷售統計圖表&#xff09;-----項目視頻沒有&#xff0c;代碼也不全&#xff0c;更改項目練習&#xff1a;學生信息管理系統。 學生信息管理系統&#xff1…

大模型助力企業提效,九章云極DataCanvas公司聯合騰訊搜狗輸入法發布私有化解決方案

近日&#xff0c;九章云極DataCanvas公司與騰訊搜狗輸入法的合作再次升級。在搜狗輸入法開發者中心正式推出之際&#xff0c;九章云極DataCanvas公司作為搜狗輸入法的首批開發合作伙伴&#xff0c;雙方聯合發布“企業知識管理助手”私有化解決方案。 “企業知識管理助手”整體私…

Facebook的魅力:數字時代的社交熱點

在當今數字化時代&#xff0c;社交媒體已經成為人們日常生活中不可或缺的一部分&#xff0c;而Facebook作為其中的巨頭&#xff0c;一直以其獨特的魅力吸引著全球數十億用戶。本文將深入探討Facebook的魅力所在&#xff0c;以及它在數字時代的社交熱點。 1. 社交網絡的霸主&…

最新微信小程序面試題集結

1、微信小程序與H5的區別? 第一條是運行環境的不同 傳統的HTML5的運行環境是瀏覽器&#xff0c;包括webview&#xff0c;而微信小程序的運行環境并非完整的瀏覽器&#xff0c;是微信開發團隊基于瀏覽器內核完全重構的一個內置解析器&#xff0c;針對小程序專門做了優化&…

對于高速信號完整性,一塊聊聊啊(17)

再來對前仿和后仿的仿真內容回顧一下&#xff1a; 從概念上有個根本的理解 前仿真又可以分為布局前仿真和布局后仿真。前者是在設計的最初階段&#xff0c;建立和驗證詳細的電氣拓撲結構并以此制定出詳細的約束規則。后者是在布局完成的狀態下&#xff0c;在布線過程中遇到的…

隨機生成序列的某一排列

隨機生成1~n的某一排列&#xff0c;要求生成每種可能的排列的概率相同 。 算法描述&#xff1a; 給定數值分別為1~n的序列a&#xff0c; 循環變量i從1到n&#xff0c;每次循環將a[i]與a[i]~a[n]中的隨機某元素交換&#xff0c;最后a數組即為隨機生成的某一排列。 #include <…

【2024】C/C++框架和庫超全總結

本文分為2部分&#xff0c;第一部分&#xff1a;值得學習的C/C語言開源項目&#xff1b;第二部分是開源框架和庫 粉絲福利&#xff0c; 免費領取C/C 開發學習資料包、技術視頻/項目代碼&#xff0c;1000道大廠面試題&#xff0c;內容包括&#xff08;C基礎&#xff0c;網絡編程…

MATLAB分類與判別模型算法:基于LVQ神經網絡的乳腺腫瘤診斷分類程序【含Matlab源碼 MX_003期】

說明 實現基于LVQ&#xff08;Learning Vector Quantization&#xff0c;學習向量量化&#xff09;神經網絡的乳腺腫瘤診斷分類任務。LVQ是一種監督學習算法&#xff0c;通常用于模式識別和分類任務。 算法思路介紹&#xff1a; 導入數據&#xff1a; 加載名為"data.mat&…

2024下半年軟考報名人數較去年減少,僅52.77萬

2024下半年軟考報名人數 2024年上半年軟考考試共計報考52.77萬人&#xff0c;其中&#xff0c;初級資格5.12萬人、中級資格24.37萬人、高級資格23.28萬人。 根據往年報名人數&#xff0c;本次考試人數是減少了的&#xff0c;原因分析如下&#xff1a; 1、原來報名熱門專業系…

C++的unique_ptr::release

釋放給調用方返回的存儲指針的所有權&#xff0c;并將存儲的指針值設置為nullptr。 使用 release接管unique_ptr存儲的原始指針的所有權。 調用方負責返回的指針的刪除。 unique-ptr設置為空的默認構造狀態。 在調用到release后&#xff0c;您可以將兼容類型的另一個指針分配到…

SSL證書申請需要多久?

SSL證書作為一種重要的網絡安全工具&#xff0c;能夠確保網站數據傳輸的安全&#xff0c;保護用戶隱私和企業數據不受侵害。本文將詳細介紹SSL證書的申請流程以及所需時間&#xff0c;幫助用戶更好地規劃和實施網絡安全策略。 SSL證書&#xff0c;也稱為TLS證書或HTTPS證書&am…

rest_asyncio 簡化和管理異步python編程中的 REST API 調用

簡介 rest_asyncio 是一個 Python 庫,用于簡化和管理異步編程中的 REST API 調用。它結合了 aiohttp 和 asyncio,提供了一種高效的方式來處理網絡請求和響應,特別是在需要大量并發請求的場景下,例如爬蟲、批量數據獲取或實時數據處理。 以下是 rest_asyncio 的主要功能和…

富格林:領會正規阻撓欺詐技巧

富格林悉知&#xff0c;在當今經濟不穩定的環境下&#xff0c;投資者們越來越傾向于將資金投入到相對安全和穩定的資產中&#xff0c;而黃金往往是他們的首選之一。但現貨黃金市場相對復雜&#xff0c;因此要想在這個市場中立足腳跟就得領會正規阻撓欺詐的技巧。以下富格林為大…

如何優化工時表管理,提升團隊效率?

時間就是金錢&#xff0c;對于企業來說&#xff0c;有效的工時表管理可以讓一切變得不同。 本文將介紹控制工時表并將業務推向新高度的策略和工具。從多級審批工作流程到利用技術&#xff0c;了解如何克服常見挑戰&#xff0c;收獲簡化工時管理流程的回報。 工時表管理,工時表…

Ardupilot開源飛控之AP_Follow

Ardupilot開源飛控之AP_Follow 1. 源由2. 定義2.1 ModeFollow類2.1.1 ModeFollow::update2.1.2 ModeFollow::_enter2.1.3 ModeFollow::_exit 2.2 AP_Follow類2.2.1 AP_Follow::handle_msg2.2.2 AP_Follow::get_target_location_and_velocity2.2.3 AP_Follow::get_velocity_ned …