计算机理论:原码、反码、补码与移码公式记忆方法(个人总结)
1、理解原码、反码、补码与移码
给定一个数,其真值为x,机器字长为n,则针对带符号数:
码制 | 理解 |
---|---|
原码 | 取|x|转化成2进制,若为正数,符号位(即最高位)为0,若为负数,符号位为1。 |
反码 | 针对原码,即除符号位外,其它位取反。 |
补码 | 针对原码,即除符号位外,其它位取反,再加1。 |
移码 | 补码符号位取反(偏移量为2n-1)。 |
2、原码、反码、补码与移码取值范围
针对机器字长为n的带符号数x,原码与反码取值范围一样,以下整数均为纯整数,小数均为纯小数:
类型 | 取值范围 |
---|---|
正整数 | 0 <= x <= 2(n-1) - 1 |
负整数 | - (2(n-1) - 1) <= x <= 0 |
正小数 | 0 <= x < 1 |
负小数 | -1 < x <= 0 |
直接看公式可能不容易记住,所以最好是记实例。针对机器字长为8位(即n=8)的带符号纯整数x,其纯整数取值范围是-127 ~ 127,即127= 128-1=27-1=2(8-1) - 1=2(n-1) - 1。纯小数的取值范围是-1 ~ 1,因为原码与反码有2个0(即-0、+0)所以正负小数都可以等于0
补码的取值范围:
类型 | 取值范围 |
---|---|
正整数 | 0 <= x <= 2(n-1) - 1 |
负整数 | -2(n-1) <= x <= 0 |
正小数 | 0 <= x < 1 |
负小数 | -1 <= x < 0 |
同样记实例。针对机器字长为8位(即n=8)的带符号纯整数x,其取值范围是-128~127,即-128 = -27 -(28-1) = -(2n-1),127= 128-1=27-1=2(8-1) - 1=2(n-1) - 1。纯小数的取值范围是-1 ~ 1,但补码只有1个0(即+0),所以负小数小于0,可以等于-1。
移码的取值范围:
类型 | 取值范围 |
---|---|
纯整数 | -2(n-1) <= x < +2(n-1) |
纯小数 | -1 <= x < 1 |
移码公式不分正负数。
3、原码、反码、补码与移码公式
针对正数(正整数与正小数),原码、反码与补码的表示是一样的。
针对机器字长为n的负数(负整数与负小数):
码制 | 类型 | 公式 | 取值范围 |
原码 | 正整数 | x | 0 <= x <= 2(n-1) - 1 |
负整数 | 2(n-1) + |x| | - (2(n-1) - 1) <= x <= 0 | |
正小数 | x | 0 <= x < 1 | |
负小数 | 20 + |x| | - 1 < x <= 0 | |
反码 | 正整数 | x | 0 <= x <= 2(n-1) - 1 |
负整数 | 2n -1 + x | - (2(n-1) - 1) <= x <= 0 | |
正小数 | x | 0 <= x < 1 | |
负小数 | 2 - 2-(n-1) + x | - 1 < x <= 0 | |
补码 | 正整数 | x | 0 <= x <= 2(n-1) - 1 |
负整数 | 2n + x | - 2(n-1) <= x < 0 | |
正小数 | x | 0 <= x < 1 | |
负小数 | 2 + x | - 1 <= x < 0 | |
移码 | 纯整数 | 2(n-1) + x | -2(n-1) <= x < 2(n-1) |
纯小数 | 1 + x | - 1 <= x < 1 |
记忆方法:(机器字长n=8)
1、对于原码负数,符号位取1,即1000 0000。若1000 0000为整数,其值为27=2n-1,若为小数,其值为20,最后加上|x|即可。
2、对于反码负数,符合位取1,数值位取反,即1111 1111,若1111 1111为整数,其值为255=2n-1,若为小数,其值为21-2-7=2-2-(n-1),最后加上x即可。
3、对于补码负数,符合位取1,数值位取反,再加1,即1 0000 0000,若1 0000 0000为整数,其值为256=2n,若为小数,其值为2,最后加上x即可。
4、对于移码,其公式与原码负整数和负小数公式相似,但移码取x,原码取|x|。