二进制与二进制运算
1. 二进制与十进制
1. 1-原码
原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。(-百度百科)
缺点:不能直接参与运算,对于值相等的正负数字相加,往往得不到结果‘0’。如0000_1110(14)+1000_1110(-14)=1001_1100。
1. 2-反码
反码通常是用来由原码求补码或者由补码求原码的过渡码。反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。(-百度百科)
1. 3-补码(原码反码没啥好说的,重点是这里)
1. 3.1-为嘛要选择这么麻烦的记录方式
要说这个问题,就要回到原码中,因为原码不能直接参与运算,例如在日常中-4+4的结果是0,但是换成原码相加,则结果肯定不是0,不管你是否忽略掉符合位。
那么,如何记录数字?(-百度百科)
先说一个问题,如何让指针指向0点(以时钟为例,时钟是12进制,也更好理解,下图我自己将12该成0,这样更符合计算机中的数字)
答案是两种:
顺时针拨动4个小时和逆时针波动8个小时。分别代表了两种运算{8点钟加4小时}与{8点中减8小时},即8+4=8-8。然后就可以知道,4等价于-8。
顺便多一句,你可能对于顺时针的拨动的“4”,是不加思考,由生活经验直接口算出来的,这个“4”其实就是钟表上的数字个数(12,0-11是12个数字)减去当前值(8)得出的 8+(12-8)。
进一步推到,上面的4等价于-8,得到12-8=-8。
ok,有了这些信息,下一步就用到计算机存储中。 以byte为例,规定一下符号位在最高为,0正1负,那我们还剩下7个位可以存储。 假如要存储-6,根据上面例子推出的,其实也可以存储 **byte的能表示的数字个数(111_1111+1)-6**,用原码运算一下,就是下图
切记切记 到这里还没有完,别忘了,上图中的被减数是byte的最大值,但是理应是byte的能表示的数字个数,所以我们要在结果上在加1。
最终,再加上符号位1,最终结果,就是1111_1010
比较一下+6的二进制与-6的二进制
得出结论:-6的表示方法为+6的反码+1,符号为1(正数的补码就是原码,负数的补码就是符号位不动,其正数的反码+1)
关于+6与-6的补码相加运算就不展开验证了,就当个作业吧,看到的在评论区自觉完成~。
附记:关于这些也是自己刚看的,一直好奇补码的这种存储方式,百度百科是以钟表为例,其实本质都是一样,当前任意值一直加加加,就会陷入循环往复之中,早晚会与起始值相同。(byte最大值+1是0,因为溢出了~)。
此篇结束也留下个疑问,为什么负数的补码会与正数的反码+1恰好相等,还是说我这种推导是错误的。
最后,如有纰漏,不吝赐教。
文章地址: