关于求负数补码
原创
负数在计算机中是用补码的形式存储的,正数在计算机中是用原码的形式存储的。
正数求原码直接将十进制转二进制即可,负数的补码是在原码的基础上除符号位外其余位取反后+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