思考 为什么要有补码得出的结论
计算机实际存在的就是补码 无其他码,说源码反码 只是为了说明。
计算机底层以1、0来表示自然中存在的数字,那么就要有基本的加减,那就要通过计算机的1、0计算来表示
如果时 正正 、 负负 都可以看成时正正相加只是多了个符号位。
如果时正负相加 那就要至少有一位作为标示位,计算机规定时左边第一位 这一位设定的应该也很有讲究,
下面看
如果时 1+ -1 那么2进制8位数表示为
00000001 + 10000001 (源码)
得到结果 10000010(-2)
显然不对了,那么单纯的位数相加还能有什么浪翻起来了,想想如果无符号位单纯 就是正数的世界 那就是
加加加 减减减 !! 减过了怎么办,再想想 因为时符号 加不超过8为都为负,不行 要阴阳调和,可以把 10000000
后面的7个0 翻转成1 再加
00000001 + 11111110 =11111111
再把 1111111 后7位转回来就是 10000000 为0了 这不就可以了 定个定义 反转码
但是如果是
00000002+11111110 = 10000000 这样应该时1啊 不行我只定义8为来加结果时1的时候超出范围了
再想想
现在知道了 在11111111 对前7进行反转值一定时在1111111里,反转 时对于
1111110
0000001
上面对应就是反转 上下想合结果一定 那边多几对应面就少几 按照道理这样 反转码就解决了问题了 但知识再1111111里
00000002+11111110 = 10000000 这样应该时1啊 这个时候就错了 蛋疼!!
要把超过就错了解决了 我再想想
想起来了 上面手贱写的
00000002+11111110 = 10000000 这样应该时1啊 不行我只定义8为来加结果时1的时候超出范围了
如果我在结果上再加上1呢 哈哈直接取8位不就是了
来试试
00000002+11111110+1 = 10000001 取8位 哈哈 超过的部分解决了 那没超过 反转的部分呢
现在就是说我反转回去了直接就少1呢
就像
00000001 +1111111(原本应该时11111110) =10000000!(原本11111111)
10000000!(原本11111111) 这个10000000是9位额 这个时候就超出了,但刚好时0 蛮好
如果不超出呢
我下面快速想了 有个有意思的东西
不超出那就时 再反转范围之内那就是 到一面越多一面就越少 没什么问题
单有个问题 10000000 ~11111111 这个范围里比 00000000~01111111 只讨论可能的情况那时一样的 单
10000000 和00000000 再计算机里不会给它表示相同的值(浪费)那 这个10000000算在负数里面 而且时补码 也就是反转码加 1 了,好就定义时-128 那么试试
10000000 +00000001=10000001 还原 源码 得到11111111 没问题 那么一直加大正数也没问题
为什么会出现这种情况呢??就因为加1 想想 想想 我想清楚 但写不下来。