补码,有两种概念,一定一定要区分清楚。
第一种概念:补码是一种计算机存储单元保存数据的形式,与其同级的概念还有原码和反码
第二种概念:补码是一个数值经过补码运算之后,所得到的数值结果,比如在数据传输之中经常使用的“校验和(CheckSum)”校验方式,就会用到补码。
如果基于第一种概念,那么求补码形式数值的过程,是与数值符号相关的,正数的补码形式数值=其原码形式数值,负数的补码形式数值=其反码形式数值+1
如果基于第二种概念,那么求补码结果的过程,是与位数(bit)相关的,比如在数据传输中所应用的“校验和”,就需要在协议中指定校验和数据占多少位,如果校验和定义了8位空间,那么其能够存储的最大有效十进制数值便为255。
那么问题来了,如果我计算得来的校验和为258,大于了255怎么办?那么就需要计算十进制258的低8位数据的补码作为校验和结果。
十进制258的二进制数值为100000010,其低8位自然是00000010,基于第二种补码的概念,求补码结果是与数值符号无关的,也就是说你无论是正数还是负数,都按照统一的公式来计算补码结果,这个公式就是(补码结果=原数值按位取反+1),那么00000010按位取反=11111101,然后再+1=11111110,十进制为254,即为数值258低8位的补码结果。