本人研究不深,如有錯誤請不吝賜教!!
1.正數的補碼表示
正數的補碼 = 原碼
負數的補碼 = + or
= +
以十進位制整數+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,在此採用 負數的補碼 = + 方法
5.補碼得到原碼
方法:符號位不動,幅度值取反
+1or
符號位不動,幅度值-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,與上文一致。
二進位制 補碼 運算
問乙個基本的問題。負數在計算機中如何表示?舉例來說,8在計算機中表示為二進位制的1000,那麼 8怎麼表示呢?很容易想到,可以將乙個二進位制位 bit 專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個位元組的最高位為符號位。那麼,8就是00001000,而 8則...
二進位制補碼運算
二進位制負數的在計算機中採用補碼的方式表示。很多人很好奇為什麼使用補碼,直接使用原碼表示多好,看上去更加直觀和易於計算。然而事實告訴我們,這種直觀只是我們人類的一廂情願罷了,在計算機看來,補碼才是它們最想要的。那麼,為什麼計算機使用補碼更好,又是如何通過補碼來計算數值的呢?我看過網路上很多解釋補碼的...
二進位制運算子及補碼
二進位制負數的在計算機中採用補碼的方式表示。很多人很好奇為什麼使用補碼,直接使用原碼表示多好,看上去更加直觀和易於計算。然而事實告訴我們,這種直觀只是我們人類的一廂情願罷了,在計算機看來,補碼才是它們最想要的。那麼,為什麼計算機使用補碼更好,又是如何通過補碼來計算數值的呢?我看過網路上很多解釋補碼的...