关于求负数补码

秒速五厘米 2021-12-20 23:41 380阅读 0赞

原创


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

正数求原码直接将十进制转二进制即可,负数的补码是在原码的基础上除符号位外其余位取反后+1。

但是用这种方式求负数补码用编程实现不太方便,下面介绍一种用编程实现起来较简便的求负数补码的方法:

1. 求出负数绝对值的原码

2. 从原码的最后一位数码位往前数,当遇到第一个1时停在此位置

3. 将第一个1前面的数码全部求反

比如:(字长为8位)

求-127的补码:

127的原码:  01111111

-127的补码:  10000001

求-80的补码:

80的原码:  01010000

-80的补码:  10110000

求-1的补码:

1的原码:  00000001

-1的补码:  11111111

这种方式用编程实现起来比较方便,在原码的基础上除符号位外其余位取反后+1的方式要考虑进位。

  1. 1 #include<stdio.h>
  2. 2 #include<memory.h>
  3. 3 #include<string.h>
  4. 4 #include<stdlib.h>
  5. 5
  6. 6 int arr[8]; //范围为 -128 ~ +127
  7. 7
  8. 8 void Complement(int number) //求负数补码
  9. 9 {
  10. 10 number=abs(number); //取绝对值
  11. 11 int i=7;
  12. 12 while(number!=0) //求出其绝对值原码
  13. 13 {
  14. 14 arr[i]=number%2;
  15. 15 i--;
  16. 16 number/=2;
  17. 17 }
  18. 18 for(i=7;i>=0;i--)
  19. 19 {
  20. 20 if(arr[i]==1)
  21. 21 {
  22. 22 int j;
  23. 23 for(j=0;j<i;j++) //取反
  24. 24 if(arr[j]==1)
  25. 25 arr[j]=0;
  26. 26 else
  27. 27 arr[j]=1;
  28. 28 break;
  29. 29 }
  30. 30 }
  31. 31 for(i=0;i<=7;i++)
  32. 32 printf("%d",arr[i]);
  33. 33 printf("\n");
  34. 34 memset(arr,0,sizeof(arr)); //重置数组
  35. 35 }
  36. 36
  37. 37 int main()
  38. 38 {
  39. 39 int i;
  40. 40 for(i=-128;i<=-1;i++) // 求 -128 ~ -1 的补码
  41. 41 Complement(i);
  42. 42 return 0;
  43. 43 }

负数补码还原成原码是这样的:

1. 从补码的最后一位数码位往前数,遇到第一个1时停止

2. 将第一个1前的全部数码取反

3. 将第一个数码置1(原来肯定是0,因为我们这里只讨论负数的补码)

为巩固知识点写下此篇博客,理解不是很深刻,如有错误,欢迎大家指正。

17:40:52

2018-04-24

转载于:https://www.cnblogs.com/chiweiming/p/8932140.html

发表评论

表情:
评论列表 (有 0 条评论,380人围观)

还没有评论,来说两句吧...

相关阅读

    相关 关于负数补码

    原创 -------------------- 负数在计算机中是用补码的形式存储的,正数在计算机中是用原码的形式存储的。 正数求原码直接将十进制转二进制即可,负数的补码是