在计算机系统中,原码、反码和补码是表示有符号整数的三种编码方式。
1,原码、反码、补码的关系
原码(Sign-Magnitude):
定义:最高位为符号位(0表示正,1表示负),其余位为数值的绝对值。
示例(8位):+5 → 00000101,-5 → 10000101
问题:加减运算需处理符号位,且存在+0(00000000)和-0(10000000)两种零的表示。
反码(Ones' Complement)
定义:正数的反码与原码相同;负数的反码符号位不变,其余位取反。
示例(8位):+5 → 00000101,-5 → 11111010
问题:仍存在双零问题(00000000和11111111),且加减运算需处理循环进位。
补码(Two's Complement)
定义:正数补码与原码相同;负数补码为反码加1。
示例(8位):+5 → 00000101,-5 → 11111011
优势:统一加减运算,无需额外处理符号位。消除双零问题,零唯一表示为00000000。
补码的10000000可表示最小值(如8位时为-128),扩展了负数范围。
三者的转换关系
正数:
原码、反码、补码三者相同。
负数:
原码 → 反码:符号位不变,其余位取反。
反码 → 补码:直接加1。
补码 → 原码:符号位不变,按位取反后加1。
补码 → 反码:直接减1。
2,通常在计算机中,有符号数是用补码形式存储的。
对于一个字节(8 位)的有符号数,最高位是符号位(0表示正数,1表示负数)。比如十六进制AA对应的二进制是 10101010,最高位为1,所以它表示一个负数。
已知补码求原码的方法是:补码减1得到反码,再将反码各位取反得到原码。或者符号位不变,按位取反后加1。那么AA的原码是11010110,按权位展开为86,带上符号即为-86.