408計組 |二、數據的表示和運算


[一 數制和編碼](#一 數制和編碼)

[二 定點數](#二 定點數)


一 數制和編碼

1.數制相互轉換

2.BCD碼

3.字符與字符串

4.校驗碼

  • 奇偶校驗
  • 海明碼
  • 循環冗余校驗碼

1.數制相互轉換

image-20210927232208387


1.1 r進制到十進制

image-20210927232246629

1.2 二進制到八進制、十六進制

image-20210927232316649

1.3 十進制到r進制

image-20210927232401029

2.BCD碼

image-20210927232423771

3.字符與字符串

image-20210927232449905

3.1 字母存儲

image-20210927232516763

3.2 漢字存儲

image-20210927232520468

4.校驗碼

4.校驗碼

4.1 奇偶校驗

image-20210926202003212

4.2 海明碼

4.2.1 求解步驟

(1)確定校驗碼位數

  • \(2^k\ge n+k+1(n+k種出錯,1種正確)\)
  • n個信息位;k個校驗位,校驗碼有\(2^k\)種狀態;

(2)確定校驗碼位置

  • \(P_i\)放在\(2^{i-1}\)的位置上,其余按順序

  • 信息位\(D_4D_3D_2D_1(1010)\),校驗位\(P_3P_2P_1\),海明碼為\(H_7H_6H_5H_4H_3H_2H_1\)

    image-20210926194702444

(3)求校驗位的值

  • \(H_i\)位置\(i\)算出對應的二進制碼

  • 從右到左按列\(h\)觀察,選出所有為1的\(H_i\)。找出\(H_i\)對應的信息位\(D_j\),對所有\(D_j\)進行異或運算,則可得出對應的\(P_h\)

    image-20210926195352566

(4)糾錯

  • 對校驗方程進行計算

  • 若出現偶校驗錯誤,將結果\(S_3S_2S_1\)轉為十進制,對應位置即為錯誤位置

    image-20210926201504716

4.2.2 檢錯與糾錯

  • 檢錯能力:2;糾錯能力:1

  • 全體校驗

    當兩個跳變時,無法根據對應的位置確定它就是出錯位。即上面無法區別是1位錯還是2位錯。所以引入全校驗位,在最后面加上\(P_全\),該值是由原始數據得出偶校驗碼。

    現在對傳輸的數據進行一次全體偶校驗進行分析

    image-20210926203551403

4.3 循環冗余校驗碼

CRC。數據發送、接受方約定一個“除數”,保證余數為0


4.3.1 求CRC碼

(1)確定長度與二進制碼

  • 信息碼長度K;
  • 校驗碼R=生成多項式最高次冪或(二進制碼位數-1);
  • 校驗碼位數N=K+R
  • 二進制碼:生成多項式的系數

(2)由模2除法求CRC碼

  • 信息碼低位補R個0(右側)
  • 模2除法
    • 被除數:信息位+R個0

    • 除數:二進制碼

    • 除的時候看被除數的最高位作為商,減的時候用異或運算。

    • 余數比被除數少一位,余數結果為校驗位

      image-20210928201812636

  • CRC碼:信息位+校驗位

4.3.2 檢錯與糾錯

  • 示例

    image-20210926211814247

  • 檢錯:

    可檢測出所有奇數個錯誤;

    可檢測出所有雙比特的錯誤;

    可檢測出所有小於等於校驗位長度的連續錯誤;

  • 糾錯:

    K個信息位,R個校驗位,若生成多項式選擇得當,且 \(2^R\ge K+R+1\),CRC碼可糾正1位錯。

二 定點數

1.定點數的表示

2.定點數運算

  • 補碼作用
  • [移位運算](#2.2 移位運算)
  • [加減運算](#2.3 加減運算)
  • [乘法運算](#2.3 乘法運算)
  • [除法運算](#2.4 除法運算)

1.定點數的表示

image-20210927215422366

表示范圍

類型 范圍
無符號數(n) \(0\sim2^n-1\)
原碼/反碼整數(n+1) \(-(2^n-1)\le x\le 2^n-1\)
原碼/反碼小數(n+1) \(-(1-2^{-n})\le x\le 1-2^{-n}\)
補碼/移碼整數(n+1) \(-2^n\le x\le2^n-1\\比原碼多表示一個-2^n\)
補碼小數(n+1) \(-1\le x\le1-2^-n\\比原碼多一個-1\)

2.定點數運算

2.1 補碼作用

減法換加法,減少硬件成本(ALU無需集成減法器)


\(x=qm+r\\x~mod~12=r\\q為整數,r為余數,m為模。即要在r相等的情況下找到x\)

  • 模余數相同的數是同一類,等價。即可知-3和9在模12的條件下是等價的。
  • 互為補數:兩個數的絕對值=模。減去一個數即加上這個數的補數。也就是\(10+(-3)\)可轉換成\(10+9\)再取模。
  • 而計算機是以\(2^8(1,00000000)\)為模的,a的補數=模-|a|=全部取反再+1

image-20210927150727185

2.2 移位運算

image-20210927215546058

2.2.1 算數移位

image-20210927153015895


補碼的算數移位

  • 正數和原碼一致

  • 由於負數補碼=反碼末位+1。所以反碼最右邊連續的1會因進位變成0,直到第一個0。故負數補碼最右邊的1及其右邊與原碼一致。而其左邊與反碼一致。所以造成了:

    • 右移(同反碼):高位補1,低位舍棄。
    • 左移(同原碼):低位補0,高位舍棄。

image-20210927152929678


加法舉例

image-20210927153138008

2.2.2 邏輯移位

RGB值例子:例如用3B儲存102、139、133

102的二進制數儲存進去並向左移動16位

139的二進制數儲存進去並向左移動8位

133的二進制數儲存進去

相加得3B的RGB值

2.2.3 循環移位

image-20210927153644315

2.3 加減運算

image-20210928213154745

2.3.1 溢出判斷

image-20210927221346287


  • 方法一:一位符號位

    \[V=AB\overline{S}+\overline{AB}S\\加數的符號位為:A、B;結果的符號位S:\\乘法表示與,加法表示或 \]

  • 方法二:一位符號位,根據進位情況判斷

    \[V=C_1\oplus C_s\\ 結果的最高數值位的進位:C_1;\\符號位的進位:C_s; \]

  • 方法三:雙符號位

    \[V=S_{s1}\oplus S_{s2}\\正數符號位:00;負數符號位11;\\結果的兩個符號位分別是S_{s1}S_{s2} \]

    ==>V=0無溢出;V=1溢出

2.3 乘法運算

chen


圖示

  • 原碼一位乘法
  • 補碼一位乘法中MQ新增了紅色部分(輔助位),為保持一致ACC、X也加了一位,變成雙符號位。

image-20210928172803913


運算過程

  • 原碼一位乘法

  • 補碼一位乘法

2.4 除法運算


2.4.1 思想

確定商:若被除數大於除數,確定1,否則0;補零繼續算

2.4.2 恢復余數法(原碼)

ACC 被除數、余數
MQ
X 除數
  • 由於計算機不會比較被除數與除數的大小,所以會默認上商1。它根據(被除數-除數/余數-除數/ACC-X)的結果的符號位判斷商1或是商0,若結果是負數,則說明被除數小於除數,即商1是錯的,此時需要變成商0,且回復余數。

  • \(被除數-除數=(ACC)-[|y|]=(ACC)+[-|y|]_補\)。更具體的轉換過程:

    • 先將原碼\(y\)變成\([y]_補\)

      若y為正,\([y]_補\)與原碼一致

      若y為負,\([y]_補\)為原碼的符號位不變,后面取反

    • 再將\([y]_補\)變為\([-y]_補\)

      \([y]_補\)全部取反再,末位+1

  • 若上面結果是負數-->恢復余數:\((ACC)+除數=(ACC)+[|y|]_補\),商變回0,再計算

  • 每次計算完邏輯左移,低位補0。機器字長有幾位就求幾位的商

  • 余數=結果*\(2^n\)(n=機器字長-符號位,左移n次 上商n+1次)

  • 示例:

    設機器字長為5位(含1位符號位,n=4),x=0.1011,y=0.1101,采用原碼恢復余數法求x/y。\(|x|=0.1011,|y|=0.1101,[|y|]_補=0.1101,[|-y|]_補=1.0011\)

    image-20210928214326169

2.4.2 加減交替法(原碼)

也稱不恢復余數。原理:若余數為負,直接商0。余數不恢復,而是:

\(新余數=余數左移1位+|除數|~(左移1位即乘以2)\)


過程

2.4.3 加減交替法(補碼)

3.強制類型轉換

C語言中以補碼的形式存儲

有符號數與無符號數:不改變數據內容,只改變解釋方式(符號位被當做數值位)

void main(){
    //有符號數:short,占2字節;
    //無符號數:unsigned
    short x=-4321;//[x]原=1001000011100001;[x]補=1110111100011111
    unsigned short y=(unsigned short)x//y=1110111100011111,真值61215
}

長整數變短整數:高位截短,保留低位

void main(){
    //int:占4字節
    int a=-165537,b=-34991;//a:0x000286a1	b:0xffff7751
    short c=(short)a,d=(short)b//c:0x68a1(-31071)	d:0X7751(30545)
}

短整數變長整數:符號擴展

void main(){
    //負數補1,正數補0
    short x=-4321;
    int m=x;//前面補1
    unsigned short n=(unsigned short)x;//變成了無符號數
    unsigned int p=n;//前面補0
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM