关于求负数补码

原创编程


负数在计算机中是用补码的形式存储的,正数在计算机中是用原码的形式存储的。数组

正数求原码直接将十进制转二进制便可,负数的补码是在原码的基础上除符号位外其他位取反后+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

相关文章
相关标签/搜索