计算机中的数据表示——原码、补码、反码、移码

我们都知道,在计算机中,信息以二进制的形式存储和运算。而每种数据表示方法都有它的优劣,因此有其不同的适用场合。本文将介绍计算机中几种不同的数据表示及其相互间转换

真值

真值,顾名思义,就是我们人脑能够理解和日常中适用的数字;只不过这里,我们理解成二进制数。

原码

原码是几种编码之中比较容易理解的——符号位+真值的绝对值;

  • 举个例子(这里我们假设机器字长八位,且以下例子均遵守该规则)
+35的原码  00100011   
-35的原码  10100011
+0.8125的原码  0.1101000
-0.8125的原码  1.1101000

总结一下原码的性质

  • 原码的正负两端所能表示的数是对称的,因此‘0’有两种表示方式:
+0的原码 00000000
-0的原码 10000000
  • 原码的计算只需要对真值前加上符号位即可
  • 表示范围:
    定点小数:-(1-2-(n-1))~ +(1-2-(n-1)
    定点整数:-(2(n-1)-1)~ +(2(n-1)-1)

原码简单的特性 使得原码在乘除运算中表现出极大的优势。

补码

补码的引入是为了简化加减运算尤其是减法运算;补码引入的条件是模的概念,即一个数加上模依旧等于这个数,一个数减去另一个数等于加上这个数的补数。

补码的定义:对于正数来说,真值即为补码编码;
对于定点负数X:补码等于2+X=2+|X|,即模取2
对于定点负整数:补码等于2n+X,即模取2n

  • 举个例子
+0.8125的补码  0.1101000
-0.8125的补码  1.0011000
+35的补码   00100011
-35的补码   11011101

总结一下补码的性质

  • 补码只有一个‘0’,因此负数比正数多一个数。
  • 补码的负数编码可以通过它的绝对值从右往左数第一个1及其右边的0不变,前面各位取反得来;这一点,上述例子也可以体现
  • 补码中-128与-1是两个比较特殊的数,他们的符号位即做了符号位,也做了数值位
  • -1的补码 1.0000000 -128的补码 10000000
  • 补码×2和÷2运算理解成简单的算术左移和算数右移。乘法需要关注的点是溢出,因此在左移的时候需要关注符号位的变化;除法右移时在前面需要填充相应数字的符号位。
  • 举列
  • X=11001010 [1/2X]=11100101 未溢出 [2X]]=10010100 未溢出;
  • X=10101010 [1/2X]]=11010101 未溢出 [2X]]=01010100 溢出;
  • 补码的正数和负数的编码值都是按照真值的递增递增的,但是从负数和正数整体来看并不满足这种规律
  • 补码表示数的范围:
    定点小数:-1 ~ +(1-2-(n-1)
    定点整数:-2(n-1) ~ +(2(n-1)-1)

补码的引入就是为了方便加减运算尤其是减法运算

反码

反码不做过多的介绍,因为计算机中并不常用。这里简要介绍一下它同其他编码的转换。

  • 正数的反码和原码即和真值一样
  • 负数的反码是它的绝对值各位取反
  • 反码和原码一样,包含两个‘0’,反码和原码表示数的范围一样。
+0 反码 00000000
-0 反码 11111111

反码简单了解即可

移码

移码常用作浮点数的阶码,在计算机中,常常需要比较两个数,因此将移码设计成为编码能随着数值的递增而递增的编码。

  • 正数的移码编码值和真值一致;
  • 负数的移码编码值在真值的基础上偏移2(n-1)
  • 由于移码的适用场合,所以不讨论定点小数的移码编码
  • 根据移码的定义 0的移码编码为10000000
  • 移码编码的大小和真值的大小成线性正比关系
  • 移码编码中只有一个0,因此和补码表示数的范围一致

一直觉得编码这部分是非常难理解的,但是学期末重新听了老师的课,发现老师讲的特别清晰,希望我的这篇博文能够帮助大家理解编码,也继续保持对计算机的热爱,笔芯

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值