2025-11-13 11:07:15
首先说补码只能表示负数因为它是用二进制倒过来算的。比如正数用原码直接存,负数得先取反再加一。比如8位二进制里,正数00000001就是原码,负数10000001也是原码。但补码是专门处理负数的,所以正数和负数都要用补码形式存。取补码的时候负数要取反加一,正数取反加一又变回原码了。比如原码10000001取补码就是11111110,再取补码又变回10000001。
为什么这样设计呢?因为这样设计能让加减法统一处理。比如计算10000001(-127)加11111111(-1),直接按补码加法得到00000000,刚好是0。如果不统一的话,正负数加法得用不同规则。再比如原码10000001取补码是11111110,再取补码时先取反变成10000001,再加一又变回原码。这里有个关键点:负数补码取两次就回到原码,正数补码取两次也回到原码。比如用8位二进制验证:原码00000001取补码还是00000001,再取补码还是00000001。负数原码10000001取补码11111110,再取补码10000001,正好循环。这说明补码系统是自洽的,取两次补码就能回到原码,不管是正数还是负数。比如原码11111111(-1)取补码是00000000,再取补码还是00000000,但这里有个特例,因为-1的补码是全0,再取补码还是全0,但实际代表的是0而不是-0。所以严格来说,补码系统在-1处有个特殊处理,但大部分情况下都是两次取补码回到原码。
本题链接: