(此博客与标签无关。标签是必填,找不到合适的而选的)
一.问题发现
不同代码制的真值范围表里,我算了一下补码1000,0000对应的真值,发现了问题。
【考试肯定不会考这个】
1计算方法:
首先符号位是负,所以符号位不变,对其他位置取反加1。(补码原码互相转换的规则)
2计算纠结ing:
加1的时候发现有进位,如果去掉这个进位不让其影响到符号位,结果原码是1000,0000=-0(10)看表发现补码1000,0000的真值是-128。计算错误
如果保留这个进位而且不影响符号位,那么就是1,1000,0000=-128。感觉不科学。
3关键点:
在只有8位代码的限制下:-128是没有原码的,没有原码就没有反码,这样就不能用取反加1这个计算方法算补码的原码了。
二.解决
1科学的方法(你得知道8位二进制数的模是多少)
回到补码本身的定义上去,按照定义来求补码,就用不着涉及原码反码。
看不懂下一段就去搜定义吧。
(以8位二进制数为例)拿到一个补码先判断正负,正的不用变直接算真值,负的用模256减去【1000,0000】作为无符号数时的真值128,得出的差就是这个负数的绝对值128,这个负数就是-128。-128就是这个补码的真值。
理解了就是爽方法,不理解也不会考你捏。
2无数学依据的偏法
求补码1000,0000的真值:符号位不变,取反加一后不去掉那个进位,同时不要忘记符号位,就可以得到1,1000,0000=-128。
3多余的会绕人的解释
补码的作用就是把模变成正负两部分,以8位二进制为例,模是256:正部分是+0~+127,负部分是-1~-128(因为计算机存二进制从全零到全1都要有意义,而第一位拿来当符号位了)。其实特殊的(这个特殊指的是相对于大众爱用的取反加1方法)就是由正数转变为负数的那一个数也是就1000,0000。
取值范围没有-0的解释:
-0由原码1000,0000求补码是1,0000,0000。而因我们限制了8位(本次计算机只存8位)所以去掉1,得-0补码=0000,0000。而0000,0000同时也是+0的补码。