原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
[+1]原 = 0000 0001
[-1]原 = 1000 0001
因为第一位是符号位, 所以8位二进制数原码的取值范围 -(2^(n-1)-1)~2^(n-1)-1
=> [-127, 127]
[1111 1111 , 0111 1111] --> [-127 , 127]
反码
- 正数:正数的反码是其本身
- 负数:负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
[+1] = [0000 0001]原 = [0000 0001]反
[-1] = [1000 0001]原 = [1111 1110]反
因为第一位是符号位, 所以8位二进制数反码的取值范围 -(2^(n-1)-1)~2^(n-1)-1
=> [-127, 127]
[1000 0000 , 0000 0000] --> [-127 , 127]
补码
- 正数:正数的补码是其本身
- 负数:负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1 =>(即在反码的基础上+1)
[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补
[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补
补码的取值范围 -2^(n-1)~2^(n-1)-1
=> [-128, 127]
移码
- 在补码的符号位取反,其余位不变
[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补 = [1000 0001]移
[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补 = [0111 1111]移
移码的取值范围 -2^(n-1)~2^(n-1)-1
=> [-128, 127]
疑问:为什么原码、反码和补码的取值范围不一样?
- 原码和反码的+0 和 -0不是同一个表示
- 移码的+0 和-0是同一个表示
[+0] = [0000 0000]原 = [0000 0000]反 = [0000 0000]补
[-0] = [1000 0000]原 = [1111 1111]反 = [0000 0000]补
[+0]原 != [-0]原
[+0]反 != [-0]反
[+0]移 == [-0]移
END
网友评论