關於求負數補碼


原創


負數在計算機中是用補碼的形式存儲的,正數在計算機中是用原碼的形式存儲的。

正數求原碼直接將十進制轉二進制即可,負數的補碼是在原碼的基礎上除符號位外其余位取反后+1。

但是用這種方式求負數補碼用編程實現不太方便,下面介紹一種用編程實現起來較簡便的求負數補碼的方法:

1. 求出負數絕對值的原碼

2. 從原碼的最后一位數碼位往前數,當遇到第一個1時停在此位置

3. 將第一個1前面的數碼全部求反

比如:(字長為8位)

求-127的補碼:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM