计算机系统中的数据表示
数据编码
数值数据的编码
1、数据表示与数据编码的有关概念
计算机可以表示的数据:
- bit
- byte
- word
计算机中需要表示、处理的数据:
- 指令
- 正数、负数,整数、小数、实数
- 文字、字符,声音、图像、视频
数据表示
-
定义:机器硬件能直接识别和引用的数据类型。
-
条件:相应的运算指令和运算硬件(处理部件)。
-
目标:
- 缩小高级语言和机器语言间的语义差别
- 提高性能/价格
- 节省处理时间和存储空间
-
实现:最小的存储空间、最简单的存取算法。
数据表示与数据结构
- 数据表示:指的是能由机器硬件直接识别和引用的数据类型。由硬件实现的数据类型
- 数据结构:面向计算机系统软件、面向应用领域所需处理的数据类型。由软件实现的数据类型。
- 目标:最大限度满足应用要求、最简化的方法实现。
- 实现:通过数据表示和软件映象相结合方法实现。
- 数据表示是数据类型的子集。
- 数据表示的确定实质上是软、硬件的取舍问题。
- 数据结构和数据表示是软、硬件的界面。
编码:采用少量的基本符号,选用一定的组合原则,以表示大量复杂多样的信息。
- 数值信息
- 非数值信息
计算机内部的数据若有确定的值,即在数轴上能找到其对应的点,则称为数值数据。
数值数据是表示数量多少和数值大小的数据。
2、原码
原码(True form): “符号-数值”表示法,
符号位+绝对值的真值
定点小数的原码定义:
定点整数原码的定义:
原码的性质:
- 带符号的绝对值表示,符号位为“0”表示该数为正,符号位为“1”表示该数为负。
- “0”不惟一(正零、负零, 通常情况下,在编程时将正零、负零都理解为0,认为它们是相等的)。
- 表示范围(机器字长为n):
- 定点小数:-(1-2-(n-1))~+(1-2-(n-1))
- 定点整数:-(2n-1-1)~+(2n-1-1)
- 若字长为n,总共有2n个码点,但对应的真值只有 2 n-1 个。
- 负数的原码大于正数的原码。
- 真值与原码之间的转换
原码的优缺点:
- 优点:
- 简单、直观,机器数和真值间的相互转换很容易。
- 实现乘、除运算的规则简单(乘数符号位与被乘数符号位进行异或逻辑)。
A | B | A ⊕ B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
- 缺点:实现加、减运算的规则较复杂。(需要先比较两个数绝对值的大小,确定结果的符号位,之后使用绝对值进行运算)
3、补码
在CPU的设计理念中,本着硬件越简单越好的原则,设计了一套编码,将减法运算改为加法运算,这样电路只需要设计一套加法器
(1)补码概念的引入
- 有模运算:在实数范围内进行的运算。
- 无模运算:在一定数值范围内进行的运算。
结论:- 假定M为模,若数a、b满足a+b=M,则称a、b互为补数。
- 在有模运算中,减去一个数等于加上这个数对模的补数。
(2)补码的定义
设模为M,一个数 X 补码的一般定义为:[ X ]补=M+X
- 若X>0,则模M作为超出部分被舍去,[ X ]补=X,因而正数的补码就是其本身;
- 若 X < 0 ,则 [ X ]补就是以 M 为模的补数。
定点小数的补码定义:
定点整数的补码定义:
(3)补码的性质
1)补码的符号位
用补码表示的数,若其最高位为“0”,则此数为正;若其最高位为“1”,则此数为负。
证明:
当0≤ X<1时,[ X ]补=X,因此有0≤ [ X ]补<1
当-1 ≤X<0时,[ X ]补=2+X,因此有1≤[ X ]补<2
2)补码中0的表示: 由补码定义,[ X ]补=0,
∴ 0的补码是惟一的。
3)补码的表示范围:
假设机器字长为n,则
-
用补码表示的定点小数,其表示范围为:-1 ≤ X ≤+(1-2-(n-1));
-
用补码表示的定点整数,其表示范围为:-2n-1 ≤ X ≤+(2n-1-1)。
比原码多表示一个数。(因为0的补码是惟一的)
4)负数的补码值大于正数的补码值
5)补码与真值、原码之间的相互转换
- 当X≥0时,X= [ X ]原=[ X ]补
- 当X<0时,假设机器字长为n,由定义得:
- 当X<0时,假设机器字长为n,由定义[ X ]补=2+X 得:-X=2-[ X ]补,
又因为:-X=| X |,因此
结论:当X<0时,
“按位取反,末位加一”:
数值部分自低位向高位搜索,第一个1及其以右的各位0保持不变,以左的各高位按位取反。
6)补码的符号位扩展
在计算机中,整数通常使用补码来表示,比如在C语言中,定义一个整型 int i ,这个整形在计算机中存储是用补码表示的,并且如果运行在32位的计算机上,它的整型是用32位的补码表示的。短整型 short j 应该是用16位的补码表示的
i = j +2,j+2的结果也应该是一个短整型,将它赋值给i,需要进行强制类型转换,把十六位的补码转换为32位的补码。
即一个补码用n位表示,现在需要将它扩展到2n位表示
- 定点小数:在其低位填充适当位数的“0”
- 定点整数:符号位扩展
【例】已知定点小数X1、X2用8位表示的补码如下:
[X1]补=0.1010110,[X2]补=1.1100101。
现要将[X1]补、[X2]补扩展为16位表示,求16位表示的[X1]补、[X2]补。
【解】
[X1]补=0.1010110 00000000
[X2]补=1.1100101 00000000
结论1:要将n位纯小数补码变为2n位,只需在末尾添加n个“0”即可。
要将n位定点整数补码用2n位表示,如何处理?
即:如何将MOD 2n的补码变成MOD 22n的补码。
推导过程:
用MOD 2n [X]补表示X以2n为模的补码,
用MOD 22n [X]补表示X以22n为模的补码。
当X ≥ 0时,
当X<0时,
综合X ≥ 0、X<0时的情况,
其中,XS为2n [X]补的符号位。
结论2:将整数补码的模扩大2n倍,只需将[X]补的符号位向左复制n位即可。
7)补码的算数右移(除2运算)
某一个数的补码经算数右移1位后,其最低有效位被移出,最高位(符号位)如何处理?
已 知 [ 𝑋 ] 补 , 求 [ 1 2 𝑋 ] 补 。 已知[ 𝑋]_补,求[\frac{1}{2} 𝑋]_补。 已知[X]补,求[21</