数据与文字的表示方法
数据格式
在计算机中对数据进行表示实际上使用计算机中的高低电平对现实中的数据进行表示,例如如果想表示现实中的自然数,我们知道计算机中的数据是用二进制来表示的,每一个位表示一个二进制位,计算机能够表示的最大数字取决于计算机的容量,但无论如何计算机的容量是有限的,用有限模拟无限这是不可能的,如果要表示的数据是整数,这些存储空间表示的数字一定在一个有限的范围中,在表示实数时也是同理,因为有限不能表示无限所以在表示实数的时候存在精度问题。
所以在计算机表示数的时候要考虑下面几个因素:
- 要表示数的类型
- 可能的数值范围
- 数值精确度
- 数据存储和处理所需要的硬件代价
计算机中常用的数据表示有两种,一种是定点格式(小数点的位置固定),另一种是浮点格式(小数点的位置可以浮动)
定点格式
因为小数点的位置固定不变,所以就不需要在对小数点有额外的关注,小数点的位置固定在哪一位都可以。
例如
| … | … | … | … | 整数第一位 | 小数点后第一位 | … | … |
|---|
假设将小数点固定在第三位上,那么小数点之后的位数就固定了,在表示数字的时候小数部分按照小数部分的转化规则来,整数部分按照整数部分的转化规则来就行
例如
| 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
|---|
此数表示的是
1 ∗ 2 4 + 1 ∗ 2 3 + 1 ∗ 2 − 1 + 1 ∗ 2 − 3 = 16 + 8 + 0.5 + 0.125 = 24.625 1*2^4+1*2^3+1*2^{-1}+1*2^{-3} = 16+8+0.5+0.125=24.625 1∗24+1∗23+1∗2−1+1∗2−3=16+8+0.5+0.125=24.625
可以看出整个数字的能够表示的最小精度为 2 − 3 2^{-3} 2−3因为你可以在任何位置进行数字的增加,但是最小的增加一定是 2 − 3 2^{-3} 2−3的整数倍,所以可以看出来定点数的精度是固定的。
通过将小数点固定在最右侧可以表示纯整数,通过将小数点固定在最左侧可以表示纯小数。
浮点格式
在我们常用的科学计数法中,我们会将下面的数进行转换成更简单的表示方法,如
1652000000 301200000000000000 1652000000\\ 301200000000000000 1652000000301200000000000000
我们在科学计数法中是可以表示为
1.652 ∗ 1 0 9 3.012 ∗ 1 0 17 1.652*10^9\\ 3.012*10^{17} 1.652∗1093.012∗1017
我们可以看到在上面的例子中可以看到尽管两个数的大小相差甚远,但是通过化成科学计数法的形式,变成了一个数乘于一个指数的形式,而且表示起来更加的简单,在计算机中浮点形式的数字就是基于这种表示的方法进行表示的。
将一个数字的有效数字和数的范围在计算机的一个存储单元中分别进行表示,这种把数的范围和精度分别表示的方法,相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称之为浮点表示法。
在计算机中都按照二进制进行表示,所以数字要化成 y ∗ 2 x y * 2^{x} y∗2x这种形式其中y是一个二进制数称为尾数,x也是一个二进制数称为阶码。
所以一个浮点数组成部分如下:
| 阶符(阶码的符号) | 阶码 | 数符(数的符号) | 尾数 |
|---|
十进制数串的表示方法
字符串形式
每一个字节存放一个十进制的数位或符号位,在主存中,这样的一个十进制数占用连续的多字节,故为了指明这样一个数,需要给出该数在主存中的起始地址和串的长度。
压缩的十进制数串形式
因为1个字节表示八个二进制位,而一个十进制位需要四个二进制位就能进行表示,因此可以在一个字节中存放两个十进制的数位,这种形式比字符串形式的存储方式节省存储空间,又便于直接完成十进制数的算术运算,是较为理想的方法。
与字符串表示形式类似,要知名一个压缩的十进制数串,也得给出它在主存中的首地址和数字位个数。
数的机器码表示
在计算机中要对数据进行运算,对数据运算如何综合考虑数据的表示形式与各种运算的关系,就产生了各种数的表示方法,如原码、补码、反码、移码。为了区别一般书写表示的数和机器中这些编码表示的数将前者称为真值,后者称为机器码。
原码表示法
若定点整数的原码形式为 x n x n − 1 x n − 2 . . . x 1 x 0 x_nx_{n-1}x_{n-2}...x_{1}x_{0} xnxn−1xn−2...x1x0(注 x n x_n xn为符号位)则原码表示的定义为
[ x ] 原 = { x 0 ≤ x < 2 n 2 n − x = 2 n + ∣ x ∣ − 2 n < x ≤ 0 [x]_{原}=\begin{cases}x&&0\leq x<2^n\\ 2^n-x = 2^n + |x| && -2^n<x\leq 0 \end{cases} [x]原={
x2n−x=2n+∣x∣0≤x<2n−2n<x≤0
上面定义的意思就是如果一个数的真值大于等于0则在机器码中的表示直接用真值表示即可,如果一个数的真值小于等于0需要用 2 n + ∣ x ∣ 2^n + |x| 2n+∣x∣表示,即在将真值转化为绝对值之后表示,然后在最高位取1进行表示。
例如:
真值:+1001,则 [ x ] 原 = 01001 [x]_{原}=01001 [x]原=01001
真值:-1001,则 [ x ] 原 = 11001 [x]_{原}=11001 [x]原=11001
在原码表示法中我们易于发现对于0这个数的表示似乎有+0和-0之分,因为0按照定义两个表示都可以。
在原码表示法中加法运算复杂,所以人们提出了补码表示方法
补码表示方法
在补码表示法中人们利用了循环的性质,利用取余操作,人们可以实现数的循环,比如下式在取余运算中是成立的
− 3 = + 9 ( m o d 12 ) -3 = +9(mod 12) −3=+9(mod12)
也就是说在取模的概念下-3和9是等价的,如果我们用8加上-3,理应得到一个5,但是如果我们使用8+9然后对12进行取模我们也会得到9,也就是说在取模的概念下可以将减法转换为加法。
在取模的概念下一旦超出模的范围就会被自动丢掉,这与计算机中的数据表示天然契合,在计算机中一旦超出最高位,超出的部分就会被丢掉。
若定点整数的原码形式为 x n x n − 1 x n − 2 . . . x 1 x 0 x_nx_{n-1}x_{n-2}...x_{1}x_{0} xnxn−1xn−2...x1x0(注 x n x_n xn为符号位),则补码表示的定义为:
[ x ] 补 = { x 0 ≤ x < 2 n 2 n + 1 + x = 2 n + 1 − ∣ x ∣ − 2 n ≤ x ≤ 0 [x]_{补}=\begin{cases} x && 0\leq x<2^n\\ 2^{n+1} + x = 2 ^{n+1} -|x|&&-2^n\leq x\leq 0 \end{cases} [x]补={
x2n+1+x=2n+1−∣x∣0≤x<2n−2n≤x≤0
这个定义的意思是,一个数的真值大于等于0,在补码表示中可以直接使用真进行表示,对高位补0即可。对于一个数的真值小于等于0则可以使用 2 n + 1 + x 2^{n+1}+x 2n+1+x进行表示,这是因为对于n+1位二进制数,最大可以表示的数为 2 n + 1 2^{n+1} 2n+1(这是模数)所以负数按照规则要转换为对应的补码形式需要加上一个模数。这是同余式的性质
利用补码进行表示的好处是在计算机中进行运算时,减法转换成为加法进行,在计算机中进行实现比较方便。
但是按照定义来说将负数转换为补码仍然需要做减法,为此可以通过反码来解决。
通过原码表示法编程补码表示法的方法
在定点数的反码表示法中,正数的机器码仍然等于其真值,而负数的符号位为1,将原码的每一位求反得到反码,反码的符号位不变,数值位最低位加1,得到反码。
移码表示法
移码通常用于浮点数的阶码的表示,由于,移码的传统定义是
[ e ] 移 = 2 k + e ≤ e ≤ [e]_{移} = 2^k + e \ \ \ \leq e\leq [e]移=2k+e ≤e≤
也就是说对于整个数的表示增加了 2 k 2^k 2k这相当于在数轴上进行了移动(增加了一个固定的偏移量),因此称为移码
浮点数的机器表示
上面我们已经讨论过了浮点表示,现在我们来讨论浮点数在计算机内部如何表示,现在计算机都采用统一的IEEE754标准中的格式表示浮点数,上文中我说
| 阶符(阶码的符号) | 阶码 | 数符(数的符号) | 尾数 |
|---|
在IEEE754标准中使用移码来表示阶码,因此32位短浮点数可以看作下面的格式进行保存
| s(符号,1位) | 阶码(移码表示,8位) | 尾数(23位) |
|---|
在IEEE754标准中,一个规格化的32位浮点数x的真值表示为
x = ( − 1 ) s ∗ ( 1. M ) ∗ 2 E − 127 x = (-1)^s*(1.M)*2^{E-127} x=(−1)s∗(1.M)∗2E−127
因为你在存储的时候增加127进行存储的,在进行解码的时候应该减去127进行解码。在尾数部分,由于规格化的浮点数的尾数域最左位总为1,因此这一位无需存储。
对于32位浮点数N,IEEE754定义:
- 若E=255且M<>0,则N=NaN。符号NaN表示无定义数据
- 若E=255且M=0,则N= ( − 1 ) s ∞ (-1)^s\infty (−1)s∞,当阶码全为1时且尾数M为全0时,表示的真值N为无穷大,结合符号位S为0或1,有 + ∞ +\infty +∞ − ∞ -\infty −∞之分
- 若E=0且M=0,则N= ( − 1 ) s 0 (-1)^s0 (−1)s0当阶码全为0且尾数全为0
数据与文字的表示方法

最低0.47元/天 解锁文章
2252

被折叠的 条评论
为什么被折叠?



