二进制数据的原码.补码.反码
注意: 原码,补码,反码 都是针对二进制的操作。
原码
其英文翻译为Signed Magnitude(数值) Representation
是一种有符号数值的表现方式,使用二进制的最高位来表示符号,其余位表示数值。
最高位为符号位,其数值意义如下
0
:表示证书1
:表示负数
例如:假设用8位也即1byte来表示数字21
可以看到最高位为0
,表示正数
那么-21
的二进制如下,其最高位为1
表示负数
原码 = 符号位 + 数值位
原码 = 最高位 + 数值位
接下来,看一个有意思的现象;能够看到 -21
跟149
的原码一模一样。
如你所见,
149
和-21
的二进制原码表示都是10010101
。这正是原码表示法的一个问题:原码无法唯一确定一个数的符号和数值。在这种情况下,仅看二进制数本身,无法区分149
和-21
。为了有效区分正负数和避免二义性,计算机通常采用补码表示法,因为补码可以唯一确定每个整数的符号和数值,并且能够更好地处理算术运算。
反码
反码(One’s Complement)是一种用于表示有符号整数的二进制编码方式。
-
负数的反码是将原码的符号位保持不变,然后将其余位逐位取反
-
正数的反码与其二进制原码相同。
假设我们用4个bit 表示-4
,其反码是对应正数的二进制位逐位取反
通过上图你能够得到一个结果就是 原码和反码的和即1 1 1 1
也即4个bit 的最大值[0 ~15].
反码的局限性之一是 +0 == 0 0 0 0
和 -0 == 1 1 1 1
,我们知道 正零和负零都是零,常规来说我们没有对0添加符号的做法。所以引入补码的概念
补码
首先,抛出概念:补码(Two’s Complement)是计算机中广泛使用的有符号整数表示方法,它解决了原码和反码的一些问题,如正负零的歧义和复杂的加减运算。补码的主要优点是能简化整数运算的实现,并且只有一种零表示。
概念比较晦涩难懂,你可以借用"南辕北辙"的经典故事,在人类已知的物理或者化学世界里,所有的事务都是有边界的,宇宙,时间,光线这种科学边界,暂不在我们考虑范畴之内.
你从地球上某个经纬度,沿着任意方向,假设你可以一致走,最终你还能回到这个经纬度上。
正数的 原码 反码 补码都是一样的。
我们知道-0
的反码是1111
,补码为其反码+1
即1 0000
,但因为刚才我们假设是4个bit,所以最高位的1
被忽略,因此补码为0000
使用 8 位二进制数据表示 21
和 -21
时,可以分别用原码、反码和补码三种方式来表示。
-
21 的 8 位二进制表示为:
- 原码:
00010101
- 反码:
00010101
- 补码:
00010101
- 原码:
-
-21 的 8 位二进制表示为:
- 原码:
10010101
- 反码:
11101010
—符号位不变,其余位取反 - 补码:
11101011
—反码+1 == 补码
- 原码:
所以在计算进中进行计算的话,都是通过补码来操作,比如 21-21=0,就等于 21 + (-21) = 0