各种机器码的本质(原码、反码、补码、移码、IEEE754格式阶码)

在这里插入图片描述

总述

  • 无论使用什么格式的机器码来表示真值,若取一定位数n以后,各个比特位的排列个数是一定的,为 2 n 2^n 2n种排列,所以选择什么格式的机器码实质上选择什么映射方式来完成从这 2 n 2^n 2n种离散排列到离散的整数真值的映射,而不同的映射方式其实只是在:算数运算能力、逻辑比较能力和可读性三者中进行权衡。
  • 需要解释上图,需要读者先接受一种思考的角度:比特位的排列可以暂时完全看成看成无符号数,其绝对值从左到右递增,而与具体的机器数格式无关

原码

最符合人类直觉的机器码

算数运算能力:差

  • 符号位不能参与运算,需要另外设置电路进行处理
  • +0和-0分别占了一个排列,既不统一又浪费空间

逻辑比较能力:差

  • 需要先区分符号位且在同一符号内部的变化趋势也不同,正数内部随着比特位的绝对值增大而增大,负数内部随着比特位的绝对值增大而减小。这意味着不仅要设置电路区分正负,甚至正数和负数内部的比较逻辑都需要不同的电路

可读性:好

  • 可读性很好,可以很方便看出真值

反码

后面补码的出现,让反码成为了仅仅为了导出补码的工具

算数运算能力:差

  • 符号位不能参与运算,需要另外设置电路进行处理
  • +0和-0分别占了一个排列,既不统一又浪费空间

逻辑比较能力:一般

  • 只需要区分符号位,在同一符号内部的变化趋势相同,都是随着比特位的绝对值增大而增大

可读性:一般

  • 可读性一般,不容易看出真值

补码

补码继承了反码的优点,克服了反码的缺点。已经是一种很优秀的机器码了

算数运算:非常好

  • 符号位可以直接参与运算
  • 0的表示完成了统一,而且可以多表示一个最小值,一举两得

逻辑比较:一般

  • 同反码一样,只需要区分符号位,在同一符号内部的变化趋势相同,都是随着比特位的绝对值增大而增大

可读性:差

  • 基本上无法读了

移码

虽然补码对于机器而言已经近乎完美,但是在某些需要频繁比较而几乎不需要进行加减运算的场合,补码的表现依然可以改进,因为它每次比较都需要先判断符号位然后再比较。如果能想到一个能免去比较符号这一步的机器码就能解决这个问题,而移码恰好完美符合这一点。

算数运算:一般

  • 不如补码方便,尤其是减法运算

逻辑比较:非常好

  • 逻辑比较:只需要按无符号数的视角比较绝对值即可,绝对值越大所表示的数的真值就越大。不需要额外设置任何电路

可读性:很好

  • 可读性:可以根据移码快速读出两数谁大谁小

IEEE 754阶码(本质是经过改造的特殊移码)

IEEE 754的阶码虽然本质上是移码,但是和一般的移码有所不同

  • 先说明,改造了哪些地方:
    • 全0和全1机器码不能再用作普通阶码,要作特殊解释
    • 偏置值小了1
  • 然后说明,为什么要这么改:
    • 全0和全1意义的修改是为了——需要特殊值来表示无穷大∞、非数NAN、0和非规格化数四种特殊情况
    • 偏置值小1是为了——获得更大的正数阶码
  • 结果:在这两点改动之后,阶码可以表示的真值的范围发生的变化是:
    • 最大值无变化,依然为 2 n − 1 − 1 2^{n-1}-1 2n11,最小值从 − 2 n -2^n 2n变成 − 2 n + 2 -2^n+2 2n+2
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 根据题目,机器字长为8位,因此需要用8位二进制数来表示这些数字的不同表示。 1. -1的表示: - 原码:10000001 - 反码:11111110 - 补码:11111111 - 移码:10000000 2. -1011001的表示: - 原码:11101001 - 反码:10010110 - 补码:10010111 - 移码:11101000 3. 1011001的表示: - 原码:01011001 - 反码:01011001 - 补码:01011001 - 移码:01011001 其中,原码表示是最基本的二进制表示,正数的原码补码相同,而负数的原码最高位为1。反码是将原码中除符号位以外的位按位取反得到的。补码是将反码末位加1得到的,是计算机中负数的标准表示方式。移码是将补码中所有位数加上一个固定值得到的,在计算机中常用于浮点数的表示。 ### 回答2: -1的原码表示为:10000001 -1的反码表示为:11111110 -1的补码表示为:11111111 -1的移码表示为:01111111 -1011001的原码表示为:11010111 -1011001的反码表示为:10101000 -1011001的补码表示为:10101001 -1011001的移码表示为:00101001 1011001的原码表示为:1011001 1011001的反码表示为:1011001 1011001的补码表示为:1011001 1011001的移码表示为:0011001 设机器字长为8位,表示范围为-128 ~ 127。可以发现上述三个数目前都是负数,而负数在计算机中是用补码表示的。所以需要将这三个数的原码转换为补码来表示。 对于原码转换为补码的方法为: 如果原码的符号位为1(表示负数),则补码不变; 如果原码的符号位为0(表示正数),则补码等于原码。 对于补码转换为反码的方法为: 如果补码的符号位为1(表示负数),则反码等于补码除符号位外的位取反; 如果补码的符号位为0(表示正数),则反码等于补码。 对于补码转换为移码的方法为: 将补码的符号位取反得到移码。 因此,给出的三个数的补码移码原码是一样的。 ### 回答3: -1的8位原码表示为:10000001 -1的8位反码表示为:11111110 -1的8位补码表示为:11111111 -1的8位移码表示为:10000000 -1011001的8位原码表示为:11011001 -1011001的8位反码表示为:11100110 -1011001的8位补码表示为:11100111 -1011001的8位移码表示为:11111110 1011001的8位原码表示为:00110001 1011001的8位反码表示为:00110001 1011001的8位补码表示为:00110001 1011001的8位移码表示为:00110001 在8位的机器中,正数的原码反码补码移码表示都相同。而负数的反码表示为对其原码除符号位外的每一位取反,补码表示为对其原码除符号位外的每一位取反,然后再加1。 移码表示是为了简化负数的运算,将其转换成的在同等位数上的正数运算。移码的规则是对补码取反得到移码,正数的移码原码相同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值