C語言輸出負數補碼
最近剛好複習到計組的定點數運算,想着以前寫快速冪都是打印出正數的補碼,從來沒有輸出過負數的補碼,於是寫了幾行代碼,加深對這方面的理解。
要知道的知識
- 數值在計算機表示爲補碼錶示,所以在C語言裏負數也是以補碼存儲的
- 瞭解算術移位和邏輯移位的區別
在第三版的神書CSAPP裏面提到
c語言標準並沒有明確定義對於有符號數使用哪種類型的右移。不幸地,這就意味着任何假設一種或者另一種右移形式的代碼都可能會遇到可移植性問題。然而,實際上,幾乎所有的編譯器/機器組合都對有符號數使用算術右移,且許多程序員也都假設機器會使用這種右移。另一方面,對於無符號數,右移必須是邏輯的
任何二進制在機器表示都是一樣的,只是c語言的不同類型對其解釋不一樣。unsigned 類型將最高位解讀爲數值位,但是像short,int之類的就把最高位解讀爲符號位。
代碼
要想打印出負數的補碼,只對負數右移是不行的,因爲它進行的是算術右移,這樣最終只會無窮無盡地右移爲-1,那麼我們就可以先把有符號轉化爲無符號,因爲二進制是一樣的,只不過無符號和有符號對二進制解讀不一樣,於是很快寫出下面幾行小代碼
#include <cstdio>
int main()
{
int num[20], cnt = 0;
short a = -4321;
unsigned short b = a;
printf("%d\n", b);
while(b)
{
num[cnt++] = b & 1;
b >>= 1;
}
for(int i = cnt - 1; i >= 0; i--)
printf("%d ", num[i]);//結果可與2018王道計組複習P45頁對比
return 0;
}