一道C++面試題和補碼谍倦、無符號數(shù)減法運算

面試題在文章第4節(jié)塞赂。在看面試題之前,可以先看一下1-3節(jié)的知識點昼蛀。

1. 補碼

Two's Complement(二補數(shù)宴猾、補碼)是對二進制數(shù)的數(shù)學(xué)運算,運算過程為:對二進制序列每一位取反(0->1; 1->0)叼旋,再加1仇哆。

bits 取反 補碼
011 100 101
010 101 110
111 000 001

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

計算機中的數(shù)值類型分為整數(shù)型和浮點數(shù)型,有符號數(shù)在最高位設(shè)置符號位夫植,其余低位均為數(shù)值位讹剔。數(shù)值位一律采用補碼形式存儲,并參與計算详民。采用補碼的形式表示有符號數(shù)至少有兩大好處延欠。

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

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

2.1 整數(shù)

正整數(shù)

正整數(shù)的補碼是其二進制表示狞玛,與原碼相同软驰。
例如,在整數(shù)類型占用4字節(jié)(32位)的系統(tǒng)中心肪,+5的補碼是00000000 00000000 00000000 00000101锭亏。最高位0表示該數(shù)值為正數(shù),其余31位表示數(shù)值大小蒙畴。

負整數(shù)

負整數(shù)的補碼需要對其絕對值的二進制表示進行補碼運算贰镣。
例如,-5的補碼是11111111 11111111 11111111 11111011膳凝。最高位為1碑隆,表示該數(shù)值為負數(shù),其余31位表示數(shù)值大小蹬音。

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

  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)苔埋,再進行計算懦砂,過程如下:

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

對于正整數(shù)(最高位為1),將非符號位的二進制位直接轉(zhuǎn)換成十進制组橄,就表示該正數(shù)的實際大小荞膘。如果一個數(shù)是負整數(shù),如何將其補碼轉(zhuǎn)換成十進制大小呢玉工?補碼運算即可羽资。
例如上面的11111111 11111111 11111111 11110111,最高位符號位是1遵班,所以該數(shù)為負數(shù)屠升,補碼運算之后為00000000 00000000 00000000 00001001,大小為9狭郑,所以表示-9腹暖。

2.2 浮點數(shù)

pass

3. 為什么是補碼?

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

取反b = 1-b (*)
b=0時丛肮,取反b為1,1-b=1魄缚;
b=1時宝与,取反b為0,1-b=0冶匹;
所以算是(*)可以表達取反運算

綜上习劫,a-b的計算過程可表達為(8bit為例)

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

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

4. 一個C++面試題

下面代碼打印多少?

#include <iostream>

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

答案是4294967271卧檐。

25uunsigned int類型墓懂,50為int類型。在這兩種操作數(shù)進行-運算時霉囚,int被提升為unsigned int型捕仔,運算變?yōu)?code>25u - 50u,結(jié)果也應(yīng)該是unsigned int類型佛嬉。經(jīng)過對-50u進行補碼運算后帶入加法運算逻澳,-25的二進制表示形式被存入內(nèi)存,即11111111 11111111 11111111 11100111(int為32位)暖呕,在打印時按無符號數(shù)處理斜做,則直接轉(zhuǎ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

更多面試題和答案:24 Essential C++ Interview Questions

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湾揽,一起剝皮案震驚了整個濱河市瓤逼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌库物,老刑警劉巖霸旗,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異戚揭,居然都是意外死亡诱告,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門民晒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來精居,“玉大人锄禽,你說我怎么就攤上這事⊙プ耍” “怎么了沃但?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佛吓。 經(jīng)常有香客問我宵晚,道長,這世上最難降的妖魔是什么维雇? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任淤刃,我火速辦了婚禮,結(jié)果婚禮上吱型,老公的妹妹穿的比我還像新娘钝凶。我一直安慰自己,他們只是感情好唁影,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布耕陷。 她就那樣靜靜地躺著,像睡著了一般据沈。 火紅的嫁衣襯著肌膚如雪哟沫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天锌介,我揣著相機與錄音嗜诀,去河邊找鬼。 笑死孔祸,一個胖子當(dāng)著我的面吹牛隆敢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崔慧,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拂蝎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惶室?” 一聲冷哼從身側(cè)響起温自,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皇钞,沒想到半個月后悼泌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡夹界,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年馆里,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸠踪,死狀恐怖以舒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慢哈,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布永票,位于F島的核電站卵贱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏侣集。R本人自食惡果不足惜键俱,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望世分。 院中可真熱鬧编振,春花似錦、人聲如沸臭埋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓢阴。三九已至畅蹂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荣恐,已是汗流浹背液斜。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叠穆,地道東北人少漆。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像硼被,于是被迫代替她去往敵國和親示损。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355