转自:原文链接:https://blog.csdn.net/littesss/article/details/70495810
一、什么是原码、反码、补码?
原码:10进制转换成2进制是原码,只不过正数的原码是本身符号位为0,负数的原码符号位为1(以下篇幅均以单字节为例:10进制1的原码是0000 0001,10进制-1的原码是1000 0001)。
反码: 正数的反码是本身,负数的反码是负数的原码0变为1,1变为0 (-1的原码是1000 0001 它的反码就是 1111 1110,)。(注意负数求反码时候的符号位不参与变换)。
补码: 正数的补码是本身,负数的补码就是负数的反码+1 ;
于是 -1 的原码是 1000 0001 , 它的反码就是 1111 1110 , 它的补码就是 1111 1111)。
如果是有符号的数据类型,规定最高位(符号位)正数为0,负数为1(规定!!!)
总结:正数的原码,反码 ,补码三值合一, 负数的原码,反码,补码不同。
二、为什么要设置反码,补码?
有人会有疑惑为什么要用反码,补码,不直接用原码呢?先搞清楚一点,反码 / 补码 / 原码 是针对二进制数而言,计算机若用原码相加减,正数加正数不会出错,然而正数和负数原码相加就会出错。
三、 二进制的减法
例如在二进制中计算5-3,计算机中实际是5+3的补码, 如下图: