您的位置:首页 > 编程语言 > Java开发

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

2016-03-16 22:31 363 查看
  思考 为什么要有补码得出的结论  

计算机实际存在的就是补码 无其他码,说源码反码 只是为了说明。

计算机底层以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  想想 想想 我想清楚 但写不下来。 

  

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java