为什么负数的补码是原码按位取反加一?
2020年8月11日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
本文目录
-
- 反码和补码存在的意义
- 为什么负数的补码是原码按位取反加一?
-
- 解释
- 参考文献
*2021年2月22日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
看了《深入理解计算机系统》这本神书后才发现,原来补码、反码和源码都是有定义的!(以前竟然都不知道,我到底学了些啥- -)如下图所示,根据补码、反码和源码的定义,很容易就能理解为什么负数的补码是原码按位取反加一,以及为什么补码计算减法就像计算加法一样,原因就是补码的第一位权重为 -2^(w-1)。
反码和补码存在的意义
反码:解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则;
补码:解决负数加法运算正负零问题,弥补了反码的不足。
总之,反码与补码都是为了解决负数运算问题,跟正数没关系,因此,不管是正整数还是正小数,原码,反码,补码均相同。
为什么负数的补码是原码按位取反加一?
但是,为什么负
做而论道_CS: 由补码换算到十进制数,也极其简单。 你只需记住:【补码首位的权,是负数】。 一般的八位二进制数,各个位的权是: 128、64、32、16、8、4、2、1; 如果是八位的补码,各个位的权则是: -128、64、32、16、8、4、2、1。 例如,有一个补码:1110 0000, 它代表的十进制是:-128 + 64 + 32 = -32。 如果,另一个补码:0110 0000, 它代表的十进制是:0 + 64 + 32 = +96。 仅仅使用【进制转换】,也就完事了! “原码反码取反加一”? 想都不用想!
做而论道_CS: 你一定能看出,补码,与负数的关系式: [负数]补码 = 256 + 该负数。 同理有: [正数]补码 = 256 + 该正数。 注意:加上 256,就出现了进位。 进位应该舍弃,256 就不用加了。 所以,公式就简化为: [正数]补码 = 该正数。 在此处,就证明了: 零和正数的补码,就是其本身。 例:+31 的补码是什么? 解:256+31 = 31 = 0001 1111 (二进制)。 求出来了! 哪里用到:原码反码补码相同!
做而论道_CS: 在两位十进制中,舍弃进位,就是:减去一百。 那么,加 99,再减 100,当然就是 “-1 ” 了! 在八位二进制中,舍弃进位,就是:减去 256。 那么,加 255,再舍弃进位,也就是 “-1 ” 了! 同理,254 (1111 1110),就是-2。 。。。 。。。 128 (1000 0000),就是-128。 以上这 128 个正数,就是计算机专家 “发明” 的补码。 ------------- 你一定能看出,补码,与负数的关系式: [负数]补码 = 256 + 该负数。 例:-31 的补码是什么? 解:256-31 = 225 = 1110 0001 (二进制)。 这就求出来了! 哪里用到:符号位原码取反加一!
做而论道_CS: 计算机中,并没有什么原码反码补码。 计算机中,也没有正负号。 计算机中的数,都是正数。 为什么正数,可以当负数使用? 关键,不是符号位。 而是你的算法。 你看十进制,两位数:0 ~ 99。 可以有:27 + 99 = (一百) 26 也可以:27 - 1 = 26 如果你忽略进位,仍旧保持两位数, 这两种算法的功能,就是相同的。 即,当你舍弃了进位: 正数,就等价于负数; 加法,就能完成减法运算! 在计算机中,舍弃进位: 减法器就省去了。 有一个加法器,便可横行天下! 你如果上过小学,一定能看懂这些的。
做而论道_CS: 计算机中,只有二进制数。 进行数字运算时,二进制数,也是数。 并非是什么原码反码补码。 一个字节的范围是:0000 0000 1111 1111。 等效的十进制数,就是:0 ~ 255。 如果出现 “进位=1”,这就是:2^8 = 256。 其中的 255: 既可以当做 255, 也可以当做-1 使用! 同理,254,也可以当做-2。 。。。 。。。 为什么同一个数, 既可以是正数、又可能是负数? 原因,并不是其首位的 “符号位”。 而是在于:你的算法。