原码,反码,补码,移码变换技巧
现在是准备软考的阶段,今天专业课上老师讲到了原码,反码,补码和移码,听得有点乱正好这些东东在软考的时候也会涉及的到,所以这两方面的原因我不得不来好好总结一下这四位大码。
一.先说为什么会有原码,反码,补码,移码
答:
在计算机里面,为了满足四则运算的要求,规定了原码、反码、补码,
为了数值之间大小的相互比较及一些格式数据记录的方便,而规定了移码.
二.分别用公式给大家介绍原码,反码,补码,移码(注:n表示机器字长)
1、原码的定义
2、补码的定义
3、反码的定义
4.移码:移码只用于表示浮点数的阶码,所以只用于整数。
(1)移码的定义:设由1位符号位和n位数值位组成的阶码,则 [X]移=2n + X -2n≤X ≤ 2n
例如: X=+1011 [X]移=11011 符号位“1”表示正号
X=-1011 [X]移=00101 符号位“0”表示负号
(2)移码与补码的关系: [X]移与[X]补的关系是符号位互为反码,
例如: X=+1011 [X]移=11011 [X]补=01011
X=-1011 [X]移=00101 [X]补=10101
怎么样?这些数学式子把大家弄迷惑没?其实这几位大码没这么难搞,没关系的,总结一下就好记了
三.下面我从正数和负数两方面对比说明他们之间的转换技巧:
正数(定点小数、定点整数):
原码,补码,反码相同;
移码只要在原码的最高位+1就可以啦,若数值最高位有进位则丢弃(不向符号位进位)
负数(定点小数、定点整数):
反码:保持原码符号位不变,数值位取反
补码:第一种方法给反码的最低位+1就可以啦,若数值最高位有进位则丢弃(不向符号位进位)
第二种方法以原码为基础,符号位不变,其他从最低位开始,直到遇到第一个1之前什么都不变,遇到第一个1保留
这个1,其他位按位取反。(个人认为这种方法比较好用)
移码:与补码的符号相反,数值位保持不变就可以啦
例如,当编码总位数为8时有:
+127的原码、反码、补码都为:0 1111111。
-127的原码、反码、补码依次为:1 1111111、1 0000000、1 0000001。
+0、-0的原码分别为:0 0000000、1 0000000,均对应真值0。
由于“编码总位数为8”的限制,真值-128无法用原码、反码来表示,似乎不能用上述规则来求解补码,但实际上是可行的——只要不管它的最高位即可,操作办法如下:
将128化为二进制为:10000000,最高位为1,可以只对舍去最高位后剩余的7位进行处理即可,首先取反得:1111111,加1得:1 0000000,最高位有进位需丢弃,即得:0000000,加上符号位就得补码:1 0000000。
又如,当编码总位数为4时,真值X=+0.101的原码、反码、补码均为:0101。
真值X=-0.101的原码、反码、补码依次为:1101、1 010、1 011。
注:在定点小数中,小数点隐含在第一位编码和第二位编码之间。
使用这样的方法进行这四码的转换,相对于套公式,个人认为轻松的多。