原码: 符号位加真值的绝对值 eg: 20 真值:**+**001 0100 原码:0001 0100(正数用0表示,负数用1表示) 反码: 正数的反码是其本身,负数的反码是原码除符号位外所有位取反 eg: 20 原码:0001 0100 反码:0001 0100 -20 原码:1001 0100 反码:1110 1011 补码: 正数的补码是其本身,负数的补码为反码+1 eg: 20 原码:0001 0100 反码:0001 0100 补码:0001 0100 -20 原码:1001 0100 反码:1110 1011 补码:1110 1100
反码和补码的意义: CPU 的运算器只实现了加法器,未实现减法器。为实现减法运算,将符号位参与运算。 20 - 20 = 20 + (-20)= 0 [0001 0100]原 + [1001 0100]原 = [1001 1000]原 = -24 但原码直接参与运算,结果是错误的, 所以出现了反码。 [0001 0100]反 + [1110 1011]反 = [1111 1111]反 = [1000 0000]原 = -0 相应则有[0000 0000]原 = +0,0在数学中,非负非正。为解决0的问题,出现了补码。 [0001 0100]补 + [1110 1100]补 = [0000 0000]补 = [0000 0000]原 = 0 即[0000 0000]用于表示0,[1000 0000]用于表示-128 -128 = (-1) +(-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补(-128无原码、反码,因用[1000 0000]原(曾经的-0) 来表示) 8位二进制数的范围: 原码、反码:[-127, 127] 补码:[-128, 127] (https://www.cnblogs.com/goahead–linux/p/10904701.html 看完大佬的文章后,捋清思路)