1. 原码
1.1 原码的介绍
原码是一种用于表示有符号整数的表示方式。
原码的最高位用来表示符号,0表示正数,1表示负数,而其余位则表示整数的值。
例如,在一个8位的原码中,+3可以表示为 00000011,-3则表示为 10000011。
1.2 原码的表示
- 正数的原码反码补码是其本身(三码合一)。 如 7的原码:0000 0111
- 负数的原码符号位为1,数值位为其绝对值。 如 -7的原码:1000 0111
若 X = +1110, 则[X]原 = 0,1110 用逗号隔开 符号位和数值位
若 X = -1110, 则[X]原 = 1,1110 用逗号隔开 符号位和数值位
1.3 原码的范围
注:1Byte (字节) = 8 bit (位)
在使用 n 位二进制进行原码表示时,原码的范围可以通过以下方式计算:
如果使用 n 位二进制表示原码,其中最高位为符号位,剩下的 n-1 位为数值位,则原码的范围可以计算如下:
对于有符号的原码表示,最高位为符号位,0 表示正数,1 表示负数。
假设 n 位二进制表示中,最高位为符号位,即第 n 位,则有效的数值位共有 n-1 位。
- 对于无符号整数,n 位二进制可以表示 2^(n-1) 个不同的数值,其范围从 0 到 2^(n-1)-1。
- 对于有符号整数,n 位二进制可以表示从 -(2^(n-1)-1) 到 2^(n-1)-1 的范围,其中最高位为符号位。
例如,如果使用 8 位二进制进行原码表示,则有符号整数的范围为 -127 到 127,无符号整数的范围为从 0 到 255。
需要注意的是,由于有一个比特用于表示符号位,因此有符号整数的表示范围比无符号整数小一半。
1.4 原码计算的弊端
- 加法和减法不统一:在原码表示中,正数和负数的加法、减法操作需要分别处理。在进行加法运算时,需要考虑符号位,并且可能存在溢出或进位的问题。减法运算也需要额外的步骤来处理负数的减法,使得运算相对复杂。
利用原码进行计算的时候,如果是正数完全没有问题;但是如果是负数计算,结果就出错,实际运算的方向跟正确的运算方向是相反的。
-
零的表示不唯一:在原码表示中,零可以有两种表示方式,即正零(0000 0000)和负零(1000 0000)。这样会导致在计算中出现冗余和不一致的情况,增加了处理零的复杂性。
-
符号位的处理困难:因为符号位单独存在,并且参与运算,所以在进行运算时需要特殊处理符号位。这不仅使得运算过程更加繁琐,还增加了错误的可能性。
-
浪费存储空间:原码表示中,负数的位数较多,会占用更多的存储空间。这样会浪费存储资源,并且增加了数据传输和处理的复杂性。
2 反码
2.1 反码出现的目的
- 为了解决原码不能计算负数的问题。
- 实现二进制加法:反码的另一个目的是使得二进制加法可以统一进行,无论是正数还是负数。对于使用反码表示的负数,加法运算就变成了非常简单的按位相加操作。这样可以简化计算,减少运算过程中的特殊情况。
2.2 反码的表示
正数的原码反码补码是其本身,负数的反码是在原码的基础上,符号位不变。数值位取反,0变1,1变0。有 +0 -0 之分
2.3 常见负数的反码
2.4 反码的弊端
负数运算的时候,如果结果不跨0,是没有任何问题的,但是如果结果跨0,跟实际结果会有1的偏差。
3 补码
计算机中的存储和计算都是以补码的形式进行的。
3.1 补码出现的目的
为了解决负数计算时跨0的问题而出现的。
3.2 补码的表示
正数的原码反码补码是其本身,负数的补码在反码的基础上+1。
另外补码还能多记录一个特殊的值-128,该数据在1个字节下,没有原码和反码。
3.3 常见负数的补码
3.4 补码的优点
唯一的零表示:解决了反码表示中存在的两个零(正零和负零)的问题。
简化运算:补码的加法和减法运算可以通过相同的方式进行,无需额外的特殊处理。这简化了计算机系统中对负数的运算过程。
扩展表示范围:补码能够更有效地表示负数,且不占用额外的位数。它允许使用相同的位数表示更大的数值范围。
4 三码互转
-
原码转反码
对于正数来说,原码、反码和补码相同,无需转换。
对于负数,将其原码的符号位保持为 1,其他位按位取反,即可得到其反码。 -
反码转原码
对于正数来说,原码、反码和补码相同,无需转换。
对于负数,将其反码的符号位保持为 1,其他位按位取反,即可得到其原码。 -
反码转补码
对于正数和零来说,原码、反码和补码相同,无需转换。
对于负数,将其反码的符号位保持为 1,然后将所有位再加上 1,即可得到其补码。 -
补码转原码
对于正数和零来说,原码、反码和补码相同,无需转换。
对于负数,将其补码减去 1,并对结果的所有位按位取反,即可得到其原码。