原码 反码 补码
冯~诺依曼提出的经典计算机体系结构框架,一台计算机由运算器,控制器,存储器,输入和输出设备组成。其中运算器,只有加法运算器。计算机中的没法直接做减法的,它的减法是通过加法来实现的。原码、反码、补码的产生过程,就是为了解决,计算机做减法和引入符号位(正号和负号)的问题。
任何存储于计算机中的数据,其本质都是以二进制码存储。
原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
反码:正数的反码等于其原码;负数的反码就是其的原码除符号位外,按位取反。
补码:正数的补码等于其原码;负数的补码等于其反码,再+1。
为了简化明了,下图给出四位二进制的补码、反码、源码表示法:
正数的 原码、反码、补码都一样,最高位表示符号位——为‘0’——表示正号
负数的 原码,数值部分和正数原码数值部分一样,最高位表示符号位——为‘1——表示负号。负数的反码就是其原码除符号位外,按位取反。负数的补码等于其反码+1
细心的读者可以看到0的源码和反码分正负,有两种形式。0的补码不分正负,只有一种形式。
[+0]原码=0000 , [-0]原码=1000 ;
[+0]反码=0000 , [-0]反码=1111;
[0]补码=0000,对于补码0用0000表示,1000表示-8——而非-0的补码!这样补码中-0不存在了!
4位二进制表示有符号数,原码、反码范围是[-7~7],补码范围是[-8~7]
引入补码后,其实减去一个数,对于数值有限制,有溢出的运算(模运算)来说,其实也相当于加上这个数的补码,把减法当成加法时并不是必须要引入符号位的。
补码加法运算: [x]补+[y]补=[x]补+[y]补
补码减法运算:[x]补 - [y]补 = [x]补 +[-y]补
下面以4位二进制数为例看看:不使用减法如何计算0110(6)-0010(2)
0110(6)-0010(2)=0110(6)+1110(14)=10100(20=16+4),对于四位二进制数,最大只能存放4位(硬件决定了),如果我们低四位,正好是0100(4),正好是我们想要的结果。
使用补码,减法运算可以转化为加法运算,对计算机硬件而言实现加法运算是比较容易的,而且速度较快。
附:原码,反码,补码杂谈 https://www.imooc.com/article/16813?block_id=tuijian_wz