第三章 数据存储
3.1 数据类型
3.1.1 位
3.1.2 位模式
3.1.3 数据压缩
3.1.4 错误检测与纠正
3.2 存储数字
3.2.1 存储整数
整数是小数的一种特殊形式,即小数点在最右边
1.存储无符号整数
(1)无符号整数存储步骤
a.将整数转化为二进制
b.如果不足n位,则在左边补齐0(n是计算机的规定用于表示无符号整数的位数),如果大于n,则导致溢出情况发生,数据无法存储。
(2)译解无符号整数
(3)溢出
如果在存储整数时发生溢出,那么计算机将抛弃高位,保留低位。
(4)无符号整数的应用
2.符号加绝对值表示法(原码)
最高位为符号位,0代表正数,1代表负数。其余位数为无符号整数,这样的编码我们称为原码。
3.二进制补码表示法
几乎所有计算机都使用二进制补码表示法来存储数据。
传统的机器码在进制转化下相对方便,但是存在一个问题。考虑以下情况:
2 − 2 = ? 2-2=? 2−2=?
将2转化为机器码得00000010,第一位代表是正数,后边代表是2的绝对值的二进制表达。-2转换为机器码得10000010,同样的,第一位代表是负数,后边代表是-2的绝对值的二进制表达。令二者做加法(2-2实际上是2+(-2),因此是做加法),得:
00000010
+
10000010
10000100
\begin{array}{r} 00000010\\ +10000010\\ \hline 10000100 \end{array}
00000010+1000001010000100
得到结果10000100,翻译回十进制得-4,这显然是出错的。原因也很容易发现,用机器码在做加减法时,实际上是把两数绝对值相加,再把符号位相加。那么如何表示负数才可以正确的进行加法运算呢?
如果我们坚持用00000010来代替+2,那么我们需要找到一个数字,令其与00000010进行加运算后等于零。因此我们列出以下式子:
00000000
−
00000010
11111110
\begin{array}{r} 00000000\\ -00000010\\ \hline 11111110 \end{array}
00000000−0000001011111110
因此我们可知在这种规则下,-2的表示方法应当是11111110,我们将这种规则成为补码。但是在现实生活中,我们不可能每次用0减去某个负数的绝对值以得到他的补码,因此我们考虑一种计算规则,直接从机器码翻译为补码。
设一个负数机器码
S
=
t
n
−
1
t
n
−
2
⋯
t
2
t
1
t
0
.
t
−
1
t
−
2
⋯
t
−
m
+
1
t
−
m
S=t_{n-1}t_{n-2}\cdots t_2t_1t_0.t_{-1}t_{-2}\cdots t_{-m+1}t_{-m}
S=tn−1tn−2⋯t2t1t0.t−1t−2⋯t−m+1t−m
我们需要找到与他的补码,首先,我们将S的除符号位全部取反,即如果
S
S
S等于1011.01101,则我们取1100.10010,这样我们就可以使它与它绝对值的原码各个位相加都等于1,我们将此成为反码 ,也就是说负数的原码的绝对值和其反码之和一定是各个位都等于1的,因此,我们只需再在反码的基础上在最低位加1,就可得到原码的补码。
如100101011.10011011,如果用0减去这个数则十分复杂,但是我们利用转反码再转补码的规则,就可以轻松得到其补码。将除符号位各位取反,得
111010100.01100100
111010100.01100100
111010100.01100100
再将其反码最低位加1,得
111010100.01100101
111010100.01100101
111010100.01100101
则这个数就是原码的补码。
需要注意的是,整数的原码、反码、补码全部相同。
3.3.2 3种系统的比较
3.3.3 实数
1.浮点数的表示方法
浮点数指小数点不固定的小数。
一般来说用以下方式表示:
这是一种32为浮点小数。
其中s代表“Sign bite”,即符号位。代表整个浮点数的正负性。0代表正数,1代表负数。占1bit
Exponent代表阶码,用于表示小数点移动的方向或位数。占8bit
Fraction代表尾数,用于表示小数的数值位。占23bit
比如光速一般表示为 + 2.99792458 × 1 0 8 m / s +2.99792458×10^8m/s +2.99792458×108m/s。其中“+”就是sign bite。
2.99792458变化后就是Fraction。
2.99792458太过复杂,我们选取一个相对简单的数:0.25,转换为二进制位0.01,表示为科学计数法为
1
×
1
0
−
10
1×10^{-10}
1×10−10,但是它的表示并不唯一,它也可以表示为
0.1
×
1
0
−
1
0.1×10^{-1}
0.1×10−1,因此我们规定Fraction的首位有且只有一位整数位1,如
0.001101101101
0.001101101101
0.001101101101
必须表示为
1.101101101
×
1
0
−
11
1.101101101×10^{-11}
1.101101101×10−11
相同的,
1001110110.1011
1001110110.1011
1001110110.1011
必须表示为
1.0011101101011
×
1
0
−
1001
1.0011101101011×10^{-1001}
1.0011101101011×10−1001
这样规定后就可以保证浮点数的表示唯一。既然第一位一定是1,那么我们就可以将他省略,以保留更多位置留给其他位的数。
回到光速的数值 + 2.99792458 × 1 0 8 m / s +2.99792458×10^8m/s +2.99792458×108m/s,8经过变化后就是Exponent。这个变化就是将他加上127(浮点数占32bit)或是加上1023(浮点数占64bit)。
之所以要这么做是因为Exponent是一个无符号整数,但事实上我们需要符号来表示小数点的左移或是右移,在32bit浮点数中,Exponent占8bit,即可以表示的区间为[0,255],选取他们中位数127,将所有指数的幂加上127,相当于Exponent的表示范围的上限和下限全部降低了127,即如今可以表示的数为[-127,128]。这里存在一种简便方法,即取移码再减1,因为取移码是将符号位取反,最高位加1相当于加128,再减一相当于加上127。
例如-12.5,转化为二进制为−1100.1。表示为科学计数法为 − 1.1001 × 1 0 11 -1.1001×10^{11} −1.1001×1011
符号位为负,即1;
阶码为3+127=130,转化为二进制为10000010;
尾数为1.1001,忽略1.,结果为1001
即-12.5的格式化浮点型为:
Sign bite | Exponent | Fraction |
---|---|---|
1 | 10000010 | 10010000000000000000000 |
2.几种特殊的浮点数
(1)0 的表示
对于阶码为 0 或 255 的情况,IEEE754 标准有特别的规定:
如果 阶码E=0并且尾数M是0,则这个数的真值为±0(正负号和数符位有关)。
因此+0 的机器码为:
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
-0 的机器码为:
10000000000000000000000000000000
10000000000000000000000000000000
10000000000000000000000000000000
需要注意一点,浮点数不能精确表示 0,而是以很小的数来近似表示 0,因为浮点数的真值等于(以32bits单精度浮点数为例):
x
=
(
−
1
)
S
×
(
1.
M
)
×
2
e
e
=
E
−
127
x=(-1)^S×(1.M)×2^e \\ e=E-127
x=(−1)S×(1.M)×2ee=E−127
那么+0的机器码对应的真值为1.0×2−127
同理,-0 机器码真值为−1.0×2−127
(2) + ∞ +\infty +∞和 − ∞ -\infty −∞的表示
如果阶码E=255并且尾数M全是0,则这个数的真值为
±
∞
±\infty
±∞(同样和符号位有关)。
因此
+
∞
+\infty
+∞的机器码为:
01111111100000000000000000000000
01111111100000000000000000000000
01111111100000000000000000000000
−
∞
-\infty
−∞的机器码为:
11111111100000000000000000000000
11111111100000000000000000000000
11111111100000000000000000000000
(3)NaN(Not a Number)
如果E=255并且M不是0,则这不是一个数(NaN)
3.3 存储文本
1.ASCII
2.Unicode
3.其他编码
3.3 存储音频
音频是一种连续的模拟信号,而电子计算机使用是离散的数字信号。因此记录与数字、文本不同。
3.4.1 采样
指每隔一段时间对模拟信号大小进行测算,这实际上类似于数学中的微分思想。只要采样频率足够高,就可以尽可能地还原连续模拟信号。
3.4.2 量化
通过四舍五入将采样的结果进行压缩。
3.4.3 编码
3.4.4 声音编码标准
MP3(MPEF Layer3)
3.5 存储图像
3.5.1 光栅图
由像素构成的图称为光栅图,储存原理与音频类似。主流编码标准有JPEG、GIF
3.5.2 矢量图
矢量图将一个图像拆分成若干个图形,存储的是绘制这些图形的命令。
3.6 存储视频
视频是图像在时间上的表示,与存储图像原理类似。