原創編程
負數在計算機中是用補碼的形式存儲的,正數在計算機中是用原碼的形式存儲的。數組
正數求原碼直接將十進制轉二進制便可,負數的補碼是在原碼的基礎上除符號位外其他位取反後+1。spa
可是用這種方式求負數補碼用編程實現不太方便,下面介紹一種用編程實現起來較簡便的求負數補碼的方法:code
1. 求出負數絕對值的原碼blog
2. 從原碼的最後一位數碼位往前數,當遇到第一個1時停在此位置博客
3. 將第一個1前面的數碼所有求反string
好比:(字長爲8位)io
求-127的補碼:class
127的原碼: 01111111基礎
-127的補碼: 10000001
求-80的補碼:
80的原碼: 01010000
-80的補碼: 10110000
求-1的補碼:
1的原碼: 00000001
-1的補碼: 11111111
這種方式用編程實現起來比較方便,在原碼的基礎上除符號位外其他位取反後+1的方式要考慮進位。
1 #include<stdio.h> 2 #include<memory.h> 3 #include<string.h> 4 #include<stdlib.h> 5 6 int arr[8]; //範圍爲 -128 ~ +127 7 8 void Complement(int number) //求負數補碼 9 { 10 number=abs(number); //取絕對值 11 int i=7; 12 while(number!=0) //求出其絕對值原碼 13 { 14 arr[i]=number%2; 15 i--; 16 number/=2; 17 } 18 for(i=7;i>=0;i--) 19 { 20 if(arr[i]==1) 21 { 22 int j; 23 for(j=0;j<i;j++) //取反 24 if(arr[j]==1) 25 arr[j]=0; 26 else 27 arr[j]=1; 28 break; 29 } 30 } 31 for(i=0;i<=7;i++) 32 printf("%d",arr[i]); 33 printf("\n"); 34 memset(arr,0,sizeof(arr)); //重置數組 35 } 36 37 int main() 38 { 39 int i; 40 for(i=-128;i<=-1;i++) // 求 -128 ~ -1 的補碼 41 Complement(i); 42 return 0; 43 }
負數補碼還原成原碼是這樣的:
1. 從補碼的最後一位數碼位往前數,遇到第一個1時中止
2. 將第一個1前的所有數碼取反
3. 將第一個數碼置1(原來確定是0,由於咱們這裏只討論負數的補碼)
爲鞏固知識點寫下此篇博客,理解不是很深入,若有錯誤,歡迎你們指正。
17:40:52
2018-04-24