#在计算机内,有符号数有3种表示法:原码、反码和补码。所有数据的运算都是采用补码进行的。
以正负8为例
##原码
+8|0 000 1000 -8|1 000 1000
就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
##反码
+8|0 000 1000 -8|1 111 0111
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
##补码
+8|0 000 1000 -8|1 111 1000
正数的补码与其原码相同;负数的补码是在其反码的末位加1。
#为什么会有这样的编码方式呢?
这样的编码方式诞生的原因其实很简单,是为了让互为相反数的两个数在二进制表示下也可以相加得0以方便运算。
我们先来解释反码,整数的反码与其原码相同,负数的反码是对其原码逐位取反,但符号位除外。
以上面的正负8为例,+8和-8的反码相加之和为1 111 1111,即相加之后为当前位数下的最大值。
此时机智的小伙伴立刻明白补码存在的意义。
负数的补码是在其反码的末位加1,末位这个1起到了画龙点睛的作用,依然以正负8为例,+8和-8的补码之和为10 000 0000,由于第一位溢出,故被舍去,于是原码补码之和成为0 000 0000,完美的0,达成正负相加得0的目的。这就是补码存在的意义。