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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

补码、无符号数减法运算

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

1. 補(bǔ)碼

Two's Complement(二補(bǔ)數(shù)、補(bǔ)碼)是對二進(jìn)制數(shù)的數(shù)學(xué)運(yùn)算,運(yùn)算過程為:對二進(jìn)制序列每一位取反(0->1; 1->0),再加1。

bits取反補(bǔ)碼
011100101
010101110
111000001

2. 計(jì)算機(jī)中有符號數(shù)的表示

計(jì)算機(jī)中的數(shù)值類型分為整數(shù)型和浮點(diǎn)數(shù)型,有符號數(shù)在最高位設(shè)置符號位,其余低位均為數(shù)值位。數(shù)值位一律采用補(bǔ)碼形式存儲,并參與計(jì)算。采用補(bǔ)碼的形式表示有符號數(shù)至少有兩大好處。

  • 符號位和數(shù)值位統(tǒng)一參與運(yùn)算,不用區(qū)分正、負(fù),加法和減法實(shí)現(xiàn)簡單;
  • 數(shù)據(jù)的原碼和補(bǔ)碼之間的相互轉(zhuǎn)換不需要依賴額外硬件電路。

下面分別介紹有符號數(shù)的表示方法

2.1 整數(shù)

正整數(shù)

正整數(shù)的補(bǔ)碼是其二進(jìn)制表示,與原碼相同。
例如,在整數(shù)類型占用4字節(jié)(32位)的系統(tǒng)中,+5的補(bǔ)碼是00000000 00000000 00000000 00000101。最高位0表示該數(shù)值為正數(shù),其余31位表示數(shù)值大小。

負(fù)整數(shù)

負(fù)整數(shù)的補(bǔ)碼需要對其絕對值的二進(jìn)制表示進(jìn)行補(bǔ)碼運(yùn)算。
例如,-5的補(bǔ)碼是11111111 11111111 11111111 11111011。最高位為1,表示該數(shù)值為負(fù)數(shù),其余31位表示數(shù)值大小。

在進(jìn)行運(yùn)算時(shí),CPU并不會區(qū)分是正數(shù)還是負(fù)數(shù),而是直接進(jìn)行計(jì)算,這正是前面介紹的符號位和數(shù)值位的統(tǒng)一。
例如,a=10, b=-5,則a+b的運(yùn)算過程如下:

00000000 00000000 00000000 00001010 (10) + 11111111 11111111 11111111 11111011 (-5) ===========================================00000000 00000000 00000000 00000101 (5)

如果,a=1, b=5,則a-b首先轉(zhuǎn)換成加法a+(-b),再進(jìn)行計(jì)算,過程如下:

a-b ==> a+(-b)00000000 00000000 00000000 00000001 (1) + 11111111 11111111 11111111 11110110 (-10) ===========================================11111111 11111111 11111111 11110111 (-9)

對于正整數(shù)(最高位為1),將非符號位的二進(jìn)制位直接轉(zhuǎn)換成十進(jìn)制,就表示該正數(shù)的實(shí)際大小。如果一個(gè)數(shù)是負(fù)整數(shù),如何將其補(bǔ)碼轉(zhuǎn)換成十進(jìn)制大小呢?補(bǔ)碼運(yùn)算即可。
例如上面的11111111 11111111 11111111 11110111,最高位符號位是1,所以該數(shù)為負(fù)數(shù),補(bǔ)碼運(yùn)算之后為00000000 00000000 00000000 00001001,大小為9,所以表示-9。

2.2 浮點(diǎn)數(shù)

pass

3. 為什么是補(bǔ)碼?

為什么兩個(gè)數(shù)相減a-b用補(bǔ)碼形式a+(-b)進(jìn)行計(jì)算的結(jié)果是正確的?不妨看一下對b進(jìn)行補(bǔ)碼的過程絕對值的二進(jìn)制序列取反,再加1。取反在計(jì)算機(jī)的邏輯電路中就是開關(guān)的閉合狀態(tài)取反即可,即1->0,0->1。如果用數(shù)學(xué)算式表達(dá)的話,對一個(gè)bit位b的取反運(yùn)算可以寫成

取反b = 1-b (*) b=0時(shí),取反b為1,1-b=1; b=1時(shí),取反b為0,1-b=0; 所以算是(*)可以表達(dá)取反運(yùn)算

綜上,a-b的計(jì)算過程可表達(dá)為(8bit為例)

a-b == a+(-b) == a+(11111111-b+1) == a+(b的補(bǔ)碼形式) 在8bit系統(tǒng)中,11111111 + 1 == 00000000,溢出。 所以,a+(11111111-b+1) = a+(0-b) = a - b

可以看出,補(bǔ)碼運(yùn)算的實(shí)現(xiàn)效果巧妙地利用了因計(jì)算機(jī)系統(tǒng)位數(shù)限制而產(chǎn)生的溢出現(xiàn)象。

4. 一個(gè)C++面試題

下面代碼打印多少?

#include <iostream>

int main(int argc, char **argv)
{
std::cout << 25u - 50;
return 0;
}

答案是4294967271。

25u是unsigned int類型,50為int類型。在這兩種操作數(shù)進(jìn)行-運(yùn)算時(shí),int被提升為unsigned int型,運(yùn)算變?yōu)?5u - 50u,結(jié)果也應(yīng)該是unsigned int類型。經(jīng)過對-50u進(jìn)行補(bǔ)碼運(yùn)算后帶入加法運(yùn)算,-25的二進(jìn)制表示形式被存入內(nèi)存,即11111111 11111111 11111111 11100111(int為32位),在打印時(shí)按無符號數(shù)處理,則直接轉(zhuǎn)換成十進(jìn)制正整數(shù)為4294967271。

11111111 11111111 11111111 11100111 = 2^31 + 2^30 + ... + 2^5 + 2^2 + 2^1 + 2^0 = 2^5(1-2^27) / (1-2) + 7 = 4294967271

總結(jié)

以上是生活随笔為你收集整理的补码、无符号数减法运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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