二进制 源码 反码 补码 只需存在 补码

  思考 为什么要有补码得出的结论  
计算机实际存在的就是补码 无其他码,说源码反码 只是为了说明。
计算机底层以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  想想 想想 我想清楚 但写不下来。 
  
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值