内容正文:
第13章 数字化信息编码
第13章 数字化信息编码
13.1 二进制
13.2 计算机的计算
13.3 整数的编码
13.4 计算机中整数的特点
13.5 小数的编码
13.6 字符的编码
13.7 八进制和十六进制
13.5.3 浮点数的特点
先讨论浮点数的取值范围。
浮点数的取值范围与其阶码的长度关系密切。码长一个字节补码形式的阶码的取值范围为
-128~127,因此浮点数的取值范围为2-128~2127。
设10x=2127,x=127×㏒2≈38,因此浮点数的取值范围为10-38~1038
与整数相比,浮点数的取值范围要大的多,浮点数在使用时不易溢出
浮点数的精度
码长3个字节的尾数只能精确到小数点后的第23位(除去符号位),似乎还不错,但这只是二进制的。
设10x=2-23,x=-23×㏒2≈-6.9,因此,浮点数能精确到十进制的小数点后的
第6到7位。
以0.1为例
数0.1=0.000110011001……B(1001为循环节)=0.110011001……B×10B-11B,
在计算机中0.1仅是0.1100 1100 1100 1100 1100 110B×10B-11B=
(1×2-1+1×2-2+1×2-5+1×2-6+1×2-9+1×2-10+1×2-13+1×2-14+1×2-17+1×2-18+1×2-21+1×2-22)×2-3=0.7999999523162841796875*0.125
=0.0999999940395355224609375。这就是0.1在计算机中的实际值。
13.6 字符的编码
字符型数据是非数值型数据,包括各种文字、数字与符号等。非数值型数据通常不参与算术运算。(字符a减去32等于多少呢?)
和数值型数据一样,字符型数据也须编码。字符型数据编码时,不仅要考虑编码长度,还要考虑如何输入字符(输入码)、如何存储字符(机内码)、如何输出字符的形状(输出码、字形码)。
13.6.1 机内码
这里主要介绍英文字符的机内码。英文字符通常包括英文字母、数字、英文的标点符号、运算符号(+,-,*,/ )等。
字符编码的原则就是标准化。
规定每个字符对应的二进制串,计算机中需要存储一个字符时就存储其对应的二进制串;反之计算机中的一个二进制串需解码为字符时就根据规定查找出对应的字符。只要采用了同一个标准,计算机间就可以传递字符信息了。
ASCII码
英文字符的机内码常采用ASCII码。ASCII码的码长为一个字节,最高位为0,因此ASCII码可以编码128(27)个英文字符,其中大部分为可打印或可显示字符,一些是控制字符。英文字符的机内码就是其在ASCII表中的编号。
例13-13 根据ASCII码表,写出下面字符的机内码。
a, A, z, Z, 0, 9, Delete键,\
13.6.2 输入码和字形码
英文字符的输入相对简单,如输入字符a时只需按下键盘上标有字母a的键即可。
ASCII表中的控制字符通常不对应键盘上的某个键,输入时相对麻烦。
在DOS窗口中,按住<Alt>键,同时用右边数字键区的数字键输入ASCII码。输入完毕后释放<Alt>键,屏幕上就会出现相对应的ASCII码的字符。这种方式可用来输入ASCII表中的控制字符。
字形码
显示器上显示的某个字符其实是它的字形码。
显示器由一个个的小方点(像素)组成,通常所说屏幕分辨率1024×768中的1024可理解为水平像素数(每行),768可理解为垂直像素数(每列)。下图假设为显示器上一个48×48的窗口。
怎样输出cbA呢?
假设一个字符要占16×16大小,可能的输出为:
字符c16×16的输出码
输出字符c时,只需把其字形码中与0对应的像素设置成一种颜色(如黑色),与1对应的像素设置成另外的颜色(如白色)即可。
字符c的16×16的输出码占16÷8×16=32个字节。
13.7 八进制和十六进制
虽然计算机使用二进制,但由于二进制数据的位数通常较多,难写难读,极易出错,因此程序中不用二进制。需要二进制时,程序中用八进制或十六进制代替。
八进制的基本符号有:0~7。十六进制的基本符号有:0~9,A、B、C、D、E和F,其中A表示十、B表示十一、C表示十二、D表示十三、E表示十四、F表示十五。
常用进制中的零到十五
八进制数在C语言中用前缀0表示,023就表示八进制数23。十六进制数前缀0x(或0X)表示,0X23就表示十六进制数23。没有前缀的数就是十进制数。
二进制数转换成十六进制数
由于24=16,所以二进制数与十六进制数的转换非常简单:4位二进制数对应1位十六进制数。
将二进制数转换成十六进制数时,以小数点为中心分别向两边分组,每4位为一组,位数不够时在两边加0补足,然后将每组二进制数化成相应的十六进制数即可。