有符號數的加減乘除

2021-09-01 15:57:15 字數 1636 閱讀 9759

首先用4位來解釋,32位太長,不好解釋,四位有符號數的範圍是-8~7,無符號數是0~15.

1. 讓我們設想一下有符號數的-2 * -2,-2的補碼是1110,在無符號數里是14,所以無符號數的乘法相當於14 * 14

二進位制乘法

1110

*1110

-------

0000

1110

1110

11000100

4位表示就是0100,補碼表示是4,二進位制也是4

而有符號-2 * -2 = 4,沒有問題, 無符號14 * 14 = 11000100(二進位制,這裡溢位了),4位擷取高位=0100=4

讓我們設想一下有符號數的-2 * 2,-2的補碼是1110,2的補碼是0010,在無符號數里是14,所以無符號數的乘法相當於14 * 2

1110

*0010

-------

11100 

擷取最高位,就是1100,就是-4,而14 * 2溢位,得到的也是1100,就是十進位制12.

首先,我們從書上了解到關鍵的幾個知識點:

1. 對無符號和補碼乘法,乘法運算的位級表示都是一樣的。

2. 機器使用一種乘法指令來進行有符號和無符號整數的乘法,也就是都採用無符號乘法處理,再取低位

按照【譚浩強.c程式設計(第三版).北京:清華大學出版社,2005】的第40頁至第41頁所述,求乙個負數的補碼的方法如下:

【例】求-10的補碼的方法如下:

1)取-10的絕對值10;

2)10的絕對值的二進位制形式為1010;

3)對1010取反得1111 1111 1111 0101(這裡假定乙個整數佔16位)

4)再加1得1111 1111 1111 0110;

即取補碼的步驟是將其絕對值按位取反再加1即可……

仍基於上例進行分析,16位儲存空間能夠儲存的有符號型數的範圍為-2^16~2^16-1,-10的補碼按無符號型別計算其值為65526。

程式設計時可用如下語句實現:

int i=-10;

i=~abs(i)+1;//abs為取絕對值,~為按位取反

這個語句涉及到了三個操作:一是求絕對值,二是按位取反,三是加1

其實可以用乙個加法操作即可搞定……

int i=-10;

i=i+2^16;

可以驗證,這種方法是等價的,-10+2^16=65526,在乙個有符號型儲存變數中儲存這個數,相當於儲存了乙個負數……

其通用的方法是:

變數a用n位來儲存,當其為負數時計算其補碼的方法是a=a+2^n;

這種方法適用於以下情況但不侷限於以下情況:

例如用matlab產生了一組有符號型數資料,產生這組資料的目的是傳給fpga進行處理,當fpga的ip核處理有符號數時就是以補碼形式進行處理的,這裡怎麼辦呢?

可以這樣辦:

當matlab產生一組有符號資料後,確定了在fpga中時使用n位儲存處理,則在matlab中再增加一步轉換即可:

data_signed=[……];%得到有符號陣列

sign=(data_signed<0);%得到與陣列對應的符號陣列,當陣列元素小於0時其值為1,反之為0

data_signed=data_signed+sign.*2^n;%當陣列元素小於1時則加上2^n,轉化為補碼形式

參考:

中加減乘除 晉朝成語 加減乘除

讀 音 ji ji n ch ng ch 釋 義 算術的四則運算,借指事物的消長變化。出 自 明 王九思 端正好 次韻贈邵晉夫歸隱 端的是太平人物,誰想道命兒中加減乘除。例句1.他們的第一台機器可以加減乘除。2.通過教她不同的錢的面額幫你的孩子學會加減乘除。3.阿拉巴馬州和密西西比州有差不多一半的孩...

有符號數加減法

題目 設計乙個有符號32位加減法器,輸入opa opb,控制訊號sub為1時,result opa opb,sub為0時,result opa opb.輸出nzcv是符號位,result為負時n 1,result為0時z 1,c是加減法器的carry,v是overflow。分析 對於有符號數,用二進...

sql的加減乘除運算 mongo 加減乘除運算

mongo語法的四則運算符號 加法 add 減法 subtract 乘法 multiply 除法 divide 求模 mod 以除法為例 其餘同 資料庫course表存在一條 id 為 5ab4dfcabeb21f77cf7dbdf3 的資料,delete欄位為2,total欄位為12,求該條資料的...