您好,現(xiàn)在蔡蔡來(lái)為大家解答以上的問(wèn)題。補(bǔ)碼溢出,補(bǔ)碼怎么算相信很多小伙伴還不知道,現(xiàn)在讓我們一起來(lái)看看吧!
1、-3的補(bǔ)碼:11111101反碼加一正數(shù)的補(bǔ)碼表示:正數(shù)的補(bǔ)碼 = 原碼負(fù)數(shù)的補(bǔ)碼 = {原碼符號(hào)位不變} + {數(shù)值位按位取反后+1} or= {原碼符號(hào)位不變} + {數(shù)值位從右邊數(shù)第一個(gè)1及其右邊的0保持不變,左邊安位取反}以十進(jìn)制整數(shù)+97和-97為例:+97原碼 = 0110_0001b+97補(bǔ)碼 = 0110_0001b-97原碼 = 1110_0001b-97補(bǔ)碼 = 1001_1111b2、純小數(shù)的原碼:純小數(shù)的原碼如何得到呢?方法有很多,在這里提供一種較為便于筆算的方法。
2、以0.64為例,通過(guò)查閱可知其原碼為0.1010_0011_1101_0111b。
3、操作方法:將0.64 * 2^n 得到X,其中n為預(yù)保留的小數(shù)點(diǎn)后位數(shù)(即認(rèn)為n為小數(shù)之后的小數(shù)不重要),X為乘法結(jié)果的整數(shù)部分。
4、此處將n取16,得X = 41943d = 1010_0011_1101_0111b即0.64的二進(jìn)制表示在左移了16位后為1010_0011_1101_0111b,因此可以認(rèn)為0.64d = 0.1010_0011_1101_0111b 與查詢(xún)結(jié)果一致。
5、再實(shí)驗(yàn)n取12,得X = 2621d = 1010_0011_1101b 即 0.64d = 0.1010_0011_1101b,在忽略12位小數(shù)之后的位數(shù)情況下,計(jì)算結(jié)果相同。
6、3、純小數(shù)的補(bǔ)碼:純小數(shù)的補(bǔ)碼遵循的規(guī)則是:在得到小數(shù)的源碼后,小數(shù)點(diǎn)前1位表示符號(hào),從最低(右)位起,找到第一個(gè)“1”照寫(xiě),之后“見(jiàn)1寫(xiě)0,見(jiàn)0寫(xiě)1”。
7、以-0.64為例,其原碼為1.1010_0011_1101_0111b則補(bǔ)碼為:1.0101_1100_0010_1001b當(dāng)然在硬件語(yǔ)言如verilog中二進(jìn)制表示時(shí)不可能帶有小數(shù)點(diǎn)(事實(shí)上不知道哪里可以帶小數(shù)點(diǎn))。
8、4、一般帶小數(shù)的補(bǔ)碼一般來(lái)說(shuō)這種情況下先轉(zhuǎn)為整數(shù)運(yùn)算比較方便-97.64為例,經(jīng)查詢(xún)其原碼為1110_0001.1010_0011_1101_0111b筆算過(guò)程:-97.64 * 2^16 = -6398935 = 1110_0001_1010_0011_1101_0111b,其中小數(shù)點(diǎn)在右數(shù)第16位,與查詢(xún)結(jié)果一致。
9、則其補(bǔ)碼為1001_1110_0101_1100_0010_1001b,在此采用 負(fù)數(shù)的補(bǔ)碼 = {原碼符號(hào)位不變} + {數(shù)值位按位取反后+1} 方法5、補(bǔ)碼得到原碼:方法:符號(hào)位不動(dòng),幅度值取反+1 or符號(hào)位不動(dòng),幅度值-1取反-97.64補(bǔ)碼 = 1001_1110(.)0101_1100_0010_1001b取反 = 1110_0001(.)1010_0011_1101_0110b+1 = 1110_0001(.)1010_0011_1101_0111b 與查詢(xún)結(jié)果一致,就是最高位,最左面的第一位;其它位,就是剩下的7位由于運(yùn)算器進(jìn)行加法是最快的,因此,使用補(bǔ)碼是為了加快計(jì)算計(jì)算機(jī)不會(huì)減法`所以用補(bǔ)碼把減法變成加法` 你看的數(shù)一般就說(shuō)"正數(shù)的補(bǔ)碼是其本身,負(fù)數(shù)的補(bǔ)碼是原碼按位取反后1,符號(hào)位就是最高位等等`。
本文就為大家分享到這里,希望小伙伴們會(huì)喜歡。