数的补数 -- 编程技巧

补数的概念:

今天在浏览各大编程练习题库时,发现一个快被自己忘却的概念:补数;
例如时钟指示为6点,想要它指向3点,可以按顺时针方向将分针转9圈,也可以逆时针方向转3圈,结果是一致的。
由于时针转一圈为12小时,而其中12在时钟里是不被显示而自动丢失的,即15-12=3,15点和3点在时钟表示上是一致的。
想象一下,在时钟这个问题上,任何时候时针向顺时针转9圈和逆时针转3圈的效果都是一致的,我们将方向定位正负,即-3与+9等价。而数学上称12为模写作(mod 12),而称+9是-3以12为模的补数。
记为:-3  +9(mod 12)             -4  +8(mod 12)               -5  +7(mod 12)
可以将模理解为一个足够大的正数,足够大到比你运算所有数字的绝对值都要大。
【以上截取自《计算机组成原理·第二版》唐朔飞著P221】
因此在模确定的情况下:
正数的补数为其自身。
一个正数和一个负数互为补数时,两数的绝对值之和为模。
一个负数可用它的正补数来代替,而这个正补数可以用模加上负数本身来得到。

分析:

在现在讨论的这个问题中(计算机存储),数的存储是以二进制进行存储的,所以模就是2的幂次方。
换而言之,此时的补数就相当于一个数(原码)的反码,即 补数 ==》反码
例如 5 的原码:101,  那么 5 的反码:010,  即 5 的补数是 2 ;
可能大家会觉得既然是反码,为何不直接用(~)取反喃。答案是肯定不行的。
因为一般而言就unsigned int来说是32bit,这简单举例一下:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值