原码、反码、补码
- [1. 引言](#1. 引言)
- [2. 原码、反码、补码](#2. 原码、反码、补码)
-
- [2.1 原码](#2.1 原码)
- [2.2 反码](#2.2 反码)
- [2.3 补码](#2.3 补码)
- 原反补的范围
- 总结
1. 引言
本篇适合没什么计算机基础的新手,快速入门上手,内容不会讲的很详细
计算机能理解的只有二进制,也就是0和1,为了更好的处理负数的问题,引入了符号位。
以八位二进制数为例,用计算机的最高位(即左边第一位)记为符号位。
其中0 为正数的符号位,1为负数的符号位,也可以和数学对应的记一下:0相当于数学中的正号,1相当于数学中的负号。
2. 原码、反码、补码
为了更好的学习原码、反码和补码,这边我们用四个十进制数字来举例,这四个数字分别是:
6 -5 -127 127
2.1 原码
原码很好理解,就是将这几个十进制数字都转换成八位二进制数字,不足的向前面补0。
首先对这几个数字的正负性进行判断。
6为正数,所以符号位即最高位为0,将6转化二进制为110,其余空的补0,即⬇️
0000 0110
同理,剩下三位数字的原码为
-5
负数,符号位1,5的二进制是101
1000 0101
-127
1111 1111
127
0111 1111
2.2 反码
在使用原码时,我们也存在弊端,在进行加法运算时,(-1)+1的结果为0,在使用原码进行计算时,人为计算会很快出现答案,但对于计算机来说,还需要单独处理符号位,计算会变得复杂。
因此,为了方便进行负数的运算,引入了反码的概念。
反码的规则是:
正数的反码=原码
负数的反码:第一位(首位)符号位不变,其它位取反,即0取1,1取0。
如:
-5的原码为 1000 0101
其补码为 1111 1010
6为正数,即其反码=原码
0000 0110
-127
1111 1111
127
0111 1111
2.3 补码
上述无论是原码还是反码都存在一个问题,关于0的表述。
在原码中,0000 0000和1000 0000都表示0,在反码中0000 0000 和1111 1111都表示0,即+0和-0表述的问题。
为了确保0的唯一性,引入了补码的概念。
正数的补码等于其原码;负数的补码等于其反码+1,原来的-0的反码为1111 1111,它的补码为0000 0000。
补充:这里反码+1的结果应该为1 0000 0000,但存储是以一字节即八位二进制数存储,所以这里的1会直接溢出(这边对溢出不进行详细介绍),即-0的补码为0000 0000,这样以来+0和-0都指向了唯一编码 0000 0000。
这边就不继续进行举例了,可以使用该网站进行查看原反补在线网站
因此负数的补码还多了一位,即1000 0000,符号位为1,因此这个数为负数,这里规定1000 0000为-128。
原反补的范围
因为在关于0的表述中,原码和反码都存在着两个不同的编码指向同一具体数值(即0),8位二进制数一共可以表达出256种可能,这边关于0的表述占了一位,因此原码和反码的表示范围为 -127~127
补码的表示范围:-128~127
总结
正数的原码反码和补码是一样的,即正数的原码=反码=补码;
负数的反码:除符号位外其余位取反;
负数的补码:反码+1。
原码、反码范围:-127~127
补码范围:-128~127
