轉載: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,就到這兒啦,作爲一種筆記供自己以後參考,也借各位網友參考……