[牛人杂谈] 负数的存储

[复制链接]
929|12
 楼主| xixi2017 发表于 2020-3-7 22:26 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. erjinzhi(char x)
  3. {
  4. char i;
  5.         for(i=7;i>=0;i--)
  6.         {
  7.                 if(x&(1<<i)) printf("1");
  8.                 else printf("0");
  9.                 if(i==4) printf(" ");
  10.         }
  11.         printf("\n");
  12. }
  13. shuju(char x)
  14. {
  15.         printf("该负数为:%d\n",x);
  16.         erjinzhi(x);       
  17. }


  18. int main()
  19. {
  20.    shuju(-1);
  21.    shuju(-2);
  22.    shuju(-3);
  23.    return 0;
  24. }
  25. //-1
  26. //负数:最高位1表示负号:1000 001
  27. //除符号位外,取反后加1:1111 111
  28. //-2
  29. //负数:最高位1表示负号:1000 010
  30. //除符号位外,取反后加1:1111 110
16035e63aefaef613.png
 楼主| xixi2017 发表于 2020-3-7 22:27 | 显示全部楼层
经过编程测试,果然跟理论是一样的。负数就是高位是负号,然后前面的是整数,然后数字部分取反,再加1.
 楼主| xixi2017 发表于 2020-3-7 22:29 | 显示全部楼层
也就是所谓的补码。
 楼主| xixi2017 发表于 2020-3-7 22:30 | 显示全部楼层
优化后
  1. #include <stdio.h>
  2. erjinzhi(char x)
  3. {
  4. char i;
  5.         for(i=7;i>=0;i--)
  6.         {
  7.                 if(x&(1<<i)) printf("1");
  8.                 else printf("0");
  9.                 if(i==4) printf(" ");
  10.         }
  11.         printf("\n");
  12. }
  13. shuju(char x)
  14. {
  15. if(x>=0)
  16.         printf("该正数为:%d\n",x);
  17. else
  18.         printf("该负数为:%d\n",x);
  19.         erjinzhi(x);       
  20. }


  21. int main()
  22. {
  23.         shuju(1);
  24.         shuju(2);
  25.         shuju(3);
  26.        
  27.         shuju(-1);
  28.         shuju(-2);
  29.         shuju(-3);
  30.         return 0;
  31. }
  32. //-1
  33. //负数:最高位1表示负号:1000 001
  34. //除符号位外,取反后加1:1111 111
  35. //-2
  36. //负数:最高位1表示负号:1000 010
  37. //除符号位外,取反后加1:1111 110


该正数为:1
0000 0001
该正数为:2
0000 0010
该正数为:3
0000 0011
该负数为:-1
1111 1111
该负数为:-2
1111 1110
该负数为:-3
1111 1101
zhuomuniao110 发表于 2020-3-7 22:41 | 显示全部楼层
讲的非常好,例子很给力。
wanduzi 发表于 2020-3-9 19:17 | 显示全部楼层
非常不错。
zhuomuniao110 发表于 2020-3-9 20:50 | 显示全部楼层
讲的非常明白。
zhuotuzi 发表于 2020-3-10 21:05 | 显示全部楼层
例子非常棒
antusheng 发表于 2020-3-12 07:56 | 显示全部楼层
这种验证方式非常棒。
zhuomuniao110 发表于 2020-3-20 11:42 | 显示全部楼层
计算机存储的方式
zhuomuniao110 发表于 2020-3-20 11:42 | 显示全部楼层
原码,反码,补码。
mintspring 发表于 2020-3-20 18:54 | 显示全部楼层
这个思路很棒。
apleilx 发表于 2020-3-21 10:51 | 显示全部楼层
补充下负数的左移右移问题。
左移1 和 正数一样,相当于乘以 +2;
右移1后高位 补1 ,相当于 除以 +2;但不整除时是舍入,正数的是舍去;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

2034

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部