先举个例子,当前时间为晚上9点,我将其加上十个小时后是几点?(不能用减法运算)
解法:我们不能使用10-(24-21),因为不允许使用加法.此处我们先用9对12进行取模,得到的结果为-3.再用10+(-3),最终结果为7.
计算机中也只有加法器,所以我们要将负数变为补码,再进行运算.最终结果再转为源码.而我们的补码也正是取模运算的结果!
补码计算方法:
- 求得原码的反码
- 反码末位加1
为什么求反码?
求负数反码的过程其实就几乎相当于取模的过程.用负数最小值1111.....减去原码即为反码.(比如用-12对-9取模结果为-3,-12-(-9)=-3)
为什么要加1?
假设一个byte数为a,a的模为128,是byte数能表示的最大值127再加1.
因为模的定义是一个整的循环,例如时钟一圈就是12.而byte最大值二进制01111111还要加上1才能表示一个完整的循环.
所以对于负数与加法的运算
-33+4
先写出-33的原码,符号位不变,其他位取反,得到反码,再末位加1,得到补码.
与4的补码相加(正数补码为本身)
结果再转为原码输出