如何計算一個有符號數的補碼錶示?

轉載:http://blog.csdn.net/jbb0523/article/details/6668237


按照【譚浩強.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,轉化爲補碼形式

 

OK,就到這兒啦,作爲一種筆記供自己以後參考,也借各位網友參考……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章