用补码取反加一求原码的陷阱
问题引入 :一个8位补码:1000 0000 请求它的原码?
【用补码取反加一求原码的陷阱】如果按照以往的取反加一经验:取反得到 1111 1111B ,再加1得到 0000 0000B ?结果是0?
这明显不对,因为我们知道不管是正0还是负0,其补码都应该是 0000 0000B而不是题中的1000 0000B。
探究: 让我们来思考一个问题:一个8位有符号二进制数,除掉符号位其表示范围为 0~128,如果加上符号位,照理说应该乘2,也就是256个码字可以用来表示,但是我们知道8位有符号数的表示范围是-127-127,也就是说一共255个数,可以发现少了一个数,这是因为负数0没有意义。我们可以猜想到:原码有255个,如果通过取反加一得到的补码也就会少一个,而这个数就是1000 0000,其无法通过取反加一得到(因为如果只有0无法借位)。所以为什么会有补码的存在,就是用来弥补原码负0的不足。
结论归纳: 原码求补码:正数不变,对于负数我们仍然可以取反加一
补码求原码:对于1开头后全0的数,其真值就是负0浪费的值,也就是-128(0到127,所以-1应该到128),这个补码是没法通过取反加一求原码的,因为其没有原码。但对于其他补码我们仍然可以取反加1求原码。
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 涉毒患者(新诗)
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。