按照【譚浩強.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,就到這兒啦,作為一種筆記供自己以後參考,也借各位網友參考……
8位有符號數的補碼表示範圍
範圍是 128至127.根據補碼的幾條規定即可推出上述結論 1 若二進位制每位全為0,則表示數0 2 若最高位 即符號位 為0,表示正數 3 若最高位為1,表示是負數,而該負數的絕對值是多少呢?將每個二進位制位 包括符號位 取反加1,得到乙個二進位制數,將該數看成無符號數,其值就是上述負數的絕對值。...
計算乙個有符號的補碼方式
在計算機內部,所有資訊都是用二進位制數串的形式表示的。整數通常都有正負之分,計算機中的整數分為無符號的和帶符號的。無符號的整數用來表示0和正整數,帶符號的證書可以表示所有的整數。由於計算機中符號和數字一樣,都必須用二進位制數串來表示,因此,正負號也必須用0 1來表示。通常我們用最高的有效位來表示數的...
C語言 有符號整型 補碼表示的小陷阱
幾乎所有的 c語言 入門書籍都會在 最前面的章節裡 介紹 資料型別,而且基本都是從 整型 開始 至少我看過的基本都是這樣 不過對這個東西的運用,似乎很多人 包括我 都是粗略的看看就過去了。這裡我說一下乙個小小的陷阱,姑且算是吧。c語言標準 要求 這些資料型別必須 至少有這樣的取值範圍。即,實際上可以...