當前位置:編程學習大全網 - 源碼下載 - 二進制補碼是如何實現的?

二進制補碼是如何實現的?

1、正數的補碼表示:

正數的補碼 = 原碼

負數的補碼 = {原碼符號位不變} + {數值位按位取反後+1} or

= {原碼符號位不變} + {數值位從右邊數第壹個1及其右邊的0保持不變,左邊安位取反}

以十進制整數+97和-97為例:

+97原碼 = 0110_0001b

+97補碼 = 0110_0001b

-97原碼 ?= 1110_0001b

-97補碼 ?= 1001_1111b

2、純小數的原碼:

純小數的原碼如何得到呢?方法有很多,在這裏提供壹種較為便於筆算的方法。

以0.64為例,通過查閱可知其原碼為0.1010_0011_1101_0111b。

操作方法:

將0.64 * 2^n 得到X,其中n為預保留的小數點後位數(即認為n為小數之後的小數不重要),X為乘法結果的整數部分。

此處將n取16,得

X = 41943d = 1010_0011_1101_0111b

即0.64的二進制表示在左移了16位後為1010_0011_1101_0111b,因此可以認為0.64d =?0.1010_0011_1101_0111b 與查詢結果壹致。

再實驗n取12,得

X = 2621d = 1010_0011_1101b 即?0.64d =?0.1010_0011_1101b,在忽略12位小數之後的位數情況下,計算結果相同。

3、純小數的補碼:

純小數的補碼遵循的規則是:在得到小數的源碼後,小數點前1位表示符號,從最低(右)位起,找到第壹個“1”照寫,之後“見1寫0,見0寫1”。

以-0.64為例,其原碼為1.1010_0011_1101_0111b

則補碼為:1.0101_1100_0010_1001b

當然在硬件語言如verilog中二進制表示時不可能帶有小數點(事實上不知道哪裏可以帶小數點)。

4、壹般帶小數的補碼

壹般來說這種情況下先轉為整數運算比較方便

-97.64為例,經查詢其原碼為1110_0001.1010_0011_1101_0111b

筆算過程:

-97.64 * 2^16 = -6398935 =?1110_0001_1010_0011_1101_0111b,其中小數點在右數第16位,與查詢結果壹致。

則其補碼為1001_1110_0101_1100_0010_1001b,在此采用?負數的補碼 = {原碼符號位不變} + {數值位按位取反後+1} ?方法

5、補碼得到原碼:

方法:符號位不動,幅度值取反+1?or符號位不動,幅度值-1取反

-97.64補碼 =?1001_1110(.)0101_1100_0010_1001b

取反 ?=?1110_0001(.)1010_0011_1101_0110b

+1 =?1110_0001(.)1010_0011_1101_0111b 與查詢結果壹致

6、補碼的拓展:

在運算時必要時要對二進制補碼進行數位拓展,此時應將符號位向前拓展。

-5補碼 = 4'b1011 = 6'b11_1011

ps.原碼的拓展是將符號位提到最前面,然後在拓展位上部0.

-5原碼 = 4‘b’1101 = 6'b10_0101,對其求補碼得6'b11_1011,與上文壹致。

擴展資料:

計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。

在計算機系統中,數值壹律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統壹處理;同時,加法和減法也可以統壹處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。

  • 上一篇:java和python是什麽
  • 下一篇:終於知道《神廟逃亡》的終點是什麽樣子了
  • copyright 2024編程學習大全網