关于求负数补码
原创
负数在计算机中是用补码的形式存储的,正数在计算机中是用原码的形式存储的。
正数求原码直接将十进制转二进制即可,负数的补码是在原码的基础上除符号位外其余位取反后+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
转载于//www.cnblogs.com/chiweiming/p/8932140.html
还没有评论,来说两句吧...