日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

原码补码与反码

發(fā)布時(shí)間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原码补码与反码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【README】

1.本文內(nèi)容總結(jié)自“哈工大劉宏偉”老師的mooc視頻《計(jì)算機(jī)組成原理》on bilibili;

2.為了便于理解,本文引入了逗號(hào)分割符號(hào)部分和數(shù)值部分,計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的時(shí)候沒有逗號(hào);


【1】原碼表示法

原碼定義: 原碼是真值保存在計(jì)算機(jī)當(dāng)中的數(shù)據(jù)格式,包括寄存器,內(nèi)存等;其數(shù)值位數(shù)是有限的(超出的部分會(huì)被丟棄)

例子:

  • 正整數(shù)原碼: x=+1110 ;x原 = 0,1110 (符號(hào)和數(shù)值通過逗號(hào)隔開)
  • 負(fù)整數(shù)原碼: x=-1110 ;x原 = 10000 - (-1110) = 1,1110;(符號(hào)和數(shù)值通過逗號(hào)隔開)
  • 正小數(shù)原碼:x=+0.1101;x原=0.1101 (符號(hào)和數(shù)值通過小數(shù)點(diǎn)隔開)
  • 負(fù)小數(shù)原碼:x=-0.1101 ;x原=1 - (-0.1101)? = 1.1101 (符號(hào)和數(shù)值通過小數(shù)點(diǎn)隔開)

  • 【2】補(bǔ)碼表示法

    補(bǔ)碼定義: 為了把加法和減法合并為加法(歸一化),即為了簡(jiǎn)化算術(shù)邏輯單元(ALU)的設(shè)計(jì),引入補(bǔ)碼讓計(jì)算機(jī)只做加法(把減法轉(zhuǎn)換為加法)

    例: x - y = x + (y)的補(bǔ)碼; 這樣就可以把減法轉(zhuǎn)換為加法;

    補(bǔ)充: CPU = ALU + CU; 中央處理器=算術(shù)邏輯單元 + 控制單元;

    【引入補(bǔ)碼的背景】

    ?以時(shí)鐘為例:現(xiàn)在是6點(diǎn);要想時(shí)鐘走到3點(diǎn),有兩種方法:

    • 方法1: 逆時(shí)針撥動(dòng)3個(gè)單元(減3);
    • 方法2: 順時(shí)針撥動(dòng)9個(gè)單元(加9);

    以上兩種方法的效果一樣(3與9之和為12,mod12),借助以上實(shí)例,容易理解補(bǔ)碼;

    注意:負(fù)小數(shù)點(diǎn)補(bǔ)碼都是取模2

    為啥是模2,因?yàn)樨?fù)整數(shù)x的補(bǔ)碼是 2^(n+1) + x ,其中n為整數(shù)數(shù)值部分位數(shù); 又負(fù)小數(shù)的整數(shù)位數(shù)為0,所以負(fù)小數(shù)的補(bǔ)碼等于 2^(0+1)+x = 2+x ;

    以上公式模擬推導(dǎo)過程(轉(zhuǎn)自視頻截圖):

    問題: -1011的補(bǔ)數(shù)為+0101; 那 +0101表示的是 -1011的補(bǔ)數(shù),還是+0101本身呢?

    解決方法:

    正數(shù)+0101 表示為 0,0101 (符號(hào)位,數(shù)值部分)正數(shù)補(bǔ)碼添上1個(gè)0;

    負(fù)數(shù)-1011 表示為 1,0101 (符號(hào)位,數(shù)值部分)負(fù)數(shù)補(bǔ)碼添上1個(gè)1 ;

    【負(fù)數(shù)】如何實(shí)現(xiàn)在負(fù)數(shù)補(bǔ)碼的符號(hào)位設(shè)置為1經(jīng)觀察發(fā)現(xiàn)(也可以通過數(shù)學(xué)歸納法證明出來)負(fù)數(shù)加上2^(n+1) 得到其補(bǔ)碼;n為原碼的位數(shù)

    取模2^(n+1) ;n=數(shù)值位數(shù);

    2^(4+1) - 1011=1,0101 ;計(jì)算過程如下:

    100000

    -1011

    ?=11111 – 1011 + 1 = 10100 + 1 = 10101 ;而補(bǔ)碼10101是真值-1011的原碼1,1011 的數(shù)值部分每位取反(得到10100),末位加1獲得的;

    【正數(shù)】補(bǔ)碼也可以通過加上 2^(n+1) 來計(jì)算補(bǔ)碼

    如正數(shù)真值=+1011

    01011

    ? +100000

    ? =101011

    紅色1被丟棄

    【求補(bǔ)碼的快捷方式】

    計(jì)算補(bǔ)碼快捷方式當(dāng)真值為負(fù)數(shù)(注意是負(fù)數(shù)),原碼符號(hào)位不變,數(shù)值部分每位取反,末位加1即可得到補(bǔ)碼;

    例子:

  • 正整數(shù)補(bǔ)碼:x=+1000110; x原=0,1000110;x補(bǔ)=0,1000110
  • 負(fù)整數(shù)補(bǔ)碼:x=-1010;x原=1,1010;x補(bǔ)=1,0110
  • 正小數(shù)補(bǔ)碼:x=+0.1010;x原=0.1010;x補(bǔ)=0.1010
  • 負(fù)小數(shù)補(bǔ)碼:x=-0.1010;x原=1.1010;x補(bǔ)=1.0110
  • 例子2:已知 x補(bǔ) = 0.0001 ,求x(真值);

    • 因?yàn)?x補(bǔ)=x;所以x=+0.0001

    例子3:已知 x補(bǔ)=1.0001;求x(真值) ?

    • 因?yàn)閤補(bǔ)=2+x;
    • 所以x(真) = x補(bǔ) - 2 = 1.0001 - 10.0000 = -(10.0000 - 1.0001) = -0.1111
    • 所以 x真=-0.1111 ;x原=1.1111 ;x補(bǔ)=1.0001 ;

    通過觀察(或數(shù)學(xué)歸納法證明),我們發(fā)現(xiàn):

  • 補(bǔ)碼轉(zhuǎn)原碼快捷方式:當(dāng)真值為負(fù)數(shù),則補(bǔ)碼符號(hào)位不變,數(shù)值部分每位取反,末位加1得到原碼;
  • 原碼轉(zhuǎn)補(bǔ)碼快捷方式:當(dāng)真值為負(fù)數(shù),則原碼符號(hào)位不變,數(shù)值部分每位取反,末位加1得到補(bǔ)碼;
  • 若X為負(fù)數(shù),則【-X】補(bǔ)=【X】補(bǔ)的符號(hào)位取反,數(shù)值各位取反末位加1;
  • 第3點(diǎn),以X= -5 為例;

    5的補(bǔ)碼,原碼均為 0,0101 ;即【5】補(bǔ)=0,0101

    -5的補(bǔ)碼等于 1,【-5】原碼=1,0101 符號(hào)位不變,數(shù)值部分每位取反,末位加1,得到

    【-5】補(bǔ)=1,1011;

    得出:【-5】補(bǔ)等于【5】補(bǔ)的符號(hào)位取反,數(shù)值各位取反末位加1 得到;?


    【3】反碼

    反碼: 和補(bǔ)碼類似,把減法轉(zhuǎn)換為加法;

    通過觀察(或數(shù)學(xué)歸納法證明),我們發(fā)現(xiàn):

  • 反碼轉(zhuǎn)原碼快捷方式:當(dāng)真值為負(fù)數(shù),則補(bǔ)碼符號(hào)位不變,數(shù)值部分每位取反得到原碼(末位不需要加1);
  • 原碼轉(zhuǎn)反碼快捷方式:當(dāng)真值為負(fù)數(shù),則原碼符號(hào)位不變,數(shù)值部分每位取反得到補(bǔ)碼(末位不需要加1);

  • 例子:

    總結(jié)

    以上是生活随笔為你收集整理的原码补码与反码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。