我们都知道,在计算机中,信息以二进制的形式存储和运算。而每种数据表示方法都有它的优劣,因此有其不同的适用场合。本文将介绍计算机中几种不同的数据表示及其相互间转换
真值
真值,顾名思义,就是我们人脑能够理解和日常中适用的数字;只不过这里,我们理解成二进制数。
原码
原码是几种编码之中比较容易理解的——符号位+真值的绝对值;
- 举个例子(这里我们假设机器字长八位,且以下例子均遵守该规则)
+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,因此和补码表示数的范围一致
一直觉得编码这部分是非常难理解的,但是学期末重新听了老师的课,发现老师讲的特别清晰,希望我的这篇博文能够帮助大家理解编码,也继续保持对计算机的热爱,笔芯