1.2数据的表示及运算
1.2.1计算机中数据的表示
在计算机内部,数值、文字、声音、图形图像等各种信息都必须经过数字化编码后才能被传送、存储和处理。
编码:采用少量的基本符号,选用一定的组合原则,来表示大量复杂多样的信息。基本符号的种类和这些符号的组合的规则是一切信息编码的两大要素。
1.进位计数制及其转换
在采用进位计数的数字系统中,如果只用个基本符号表示数值,则称其为进制,称为该数值的基数。不同数值的共同特点如下:
(1)每一种数值都有固定的符号集。
二进制数制的基本符号():0,1
八进制数制的基本符号():0,1,2,3,4,5,6,7
十进制数制的基本符号():0,1,2,3,4,5,6,7,8,9
十六进制数制的基本符号():0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
……
(2)每一种数值都使用位置表示法。
例如,的近似数
十进制数可表示为
表1-1 常用计数制 | ||||
进位制 | 二进制 | 八进制 | 十进制 | 十六进制 |
规则 | 逢二进一 | 逢八进一 | 逢十进一 | 逢十六进一 |
基数 | ||||
数符 | ||||
权 | ||||
形式表示符 |
1)十进制计数与二进制计数法的相互转换
十进制数转换为二进制数方法:整数部分和小数部分分别转换,然后再合并。整数是“除以2取余数”;小数是“乘以2取整数”。
二进制数转换为十进制数方法:将二进制数的每一个位数乘以它的权,然后相加,即可求得相应的十进制数值。
【例1-1】把十进制数转换为相应的二进制数。
整数部分:
算式 | 商(整数部分) | 余数 |
1 | ||
整数部分从下到上依次排序:110100101
小数部分:
算式 | 乘积 | 整数部分 |
1 |
小数部分从上到下(与整数不同)依次排序:101
综上所述,
【例1-2】把二进制数转换为相应的十进制数。
2)八进制计数与十进制、二进制计数法的相互转换
十进制数转换为八进制数方法:对于十进制整数采用“除以8取余数”的方法转换为八进制整数;对于十进制小数则采用“乘以8取整数”的方法转换为八进制小数。
二进制数转换为八进制数方法:从小数点起,每三位二进制位分成一组(不足3位时,在小数点左边时左边补0,在小数点右边时右边补0),然后写出每一组的等值八进制数,顺序排列起来就得到所要求的八进制数。
从小数点起,每三位二进制位分成一组(不足3位时,在小数点左边时左边补0,在小数点右边时右边补0),然后写出每一组的等值八进制数,顺序排列起来就得到所要求的八进制数。将二级制数转化为相对应的八进制数。
【例1-3】把二进制数转换为相应的八进制数
=
依照同样的思想,将一位八进制数用三位二进制数表示,就可以直接将八进制数转换成二进制数。
表1-2 二进制、八进制和十六进制数之间的对应关系 | |||||
二进制 | 八进制 | 二进制 | 十六进制 | 二进制 | 十六进制 |
000 | 0 | 0000 | 0 | 1000 | 8 |
001 | 1 | 0001 | 1 | 1001 | 9 |
010 | 2 | 0010 | 2 | 1010 | A |
011 | 3 | 0011 | 3 | 1011 | B |
100 | 4 | 0100 | 4 | 1100 | C |
101 | 5 | 0101 | 5 | 1101 | D |
110 | 6 | 0110 | 6 | 1110 | E |
111 | 7 | 0111 | 7 | 1111 | F |
3)十六进制计数与十进制、二进制计数法的相互转换
十进制数转换为十六进制数方法:对于十进制整数采用“除以16取余数”的方法转换为十六进制整数;对于十进制小数则采用“乘以16取整数”的方法转换为十六进制小数。
二进制数转换为十六进制数方法:从小数点起,每4位二进制位分成一组(不足4位时,在小数点左边时左边补0,在小数点右边时右边补0),然后写出每一组的等值十六进制数,顺序排列起来就得到所要求的十六进制数。
【例1-4】把二进制数转换为相应的十六进制数
=0001 1011 0101.1100 1000=
2.二进制运算规则
(1)加法:二进制加法的进位规则是“逢二进一”。
0+0=0 | 1+0=1 | 0+1=1 | 1+1=0(有进位) |
(2)减法:二进制减法的借位规则是“借一当二”。
0-0=0 | 1-0=1 | 1-1=0 | 0-1=1(有借位) |
(3)乘法:
0×0=0 | 1×0=0 | 0×1=0 | 1×1=1 |
3.机器码和码制
机器数:
概念:各种数据在计算机中表示的形式
特点:采用二进制,小数点隐含表示而且不占位置。
真值:机器数对应的实际数值,用正负号表示的数值。
符号数字化:用表示正号,用表示符号
机器数:符号数字化以后的数值称为机器数,其常见编码有4种。1.原码2.反码3.补码4.移码
对于带符号数,机器数的最高位是表示正、负的符号位,其余位则表示数值。若约定小数点的位置在机器数的最低位数值位之后,则是纯整数;若约定小数点的位置在机器数的最高位数值位之前(符号位之后),则是纯小数;无符号数是指全部二进制位均代表数值,没有符号位。
为了便于运算,带符号的机器数可采用原码、反码和补码、移码等不同的编码方法。
数据的表示-机器码 | ||
原码 | 用0表示正数,用1表示负数,最高位为符号位。数值0可分为+0和-0。 | |
运算时将数值位和符号位分开处理。 | ||
取值范围~,8位长度时范围~。 |
正数 | 负数 | 负数 | ||
0 | 0000 | -0 | 1000 | |
1 | 0001 | -1 | 1001 | |
2 | 0010 | -2 | 1010 | |
3 | 0011 | -3 | 1011 | |
4 | 0100 | -4 | 1100 | |
5 | 0101 | -5 | 1101 | |
6 | 0110 | -6 | 1110 | |
7 | 0111 | -7 | 1111 |
数据的表示-机器码 | ||
反码 | 正数的反码就是原码 | |
负数的反码是在原码的基础上,符号位不变,对其余位逐位变反 |
原码 | 反码 | ||||
正数 | 负数 | 负数 | |||
0 | 0000 | -0 | 1000 | -0 | 1111 |
1 | 0001 | -1 | 1001 | -1 | 1110 |
2 | 0010 | -2 | 1010 | -2 | 1101 |
3 | 0011 | -3 | 1011 | -3 | 1100 |
4 | 0100 | -4 | 1100 | -4 | 1011 |
5 | 0101 | -5 | 1101 | -5 | 1010 |
6 | 0110 | -6 | 1110 | -6 | 1001 |
7 | 0111 | -7 | 1111 | -7 | 1000 |
数据的表示-机器码 | ||
补码 | 正数的补码与原码相同、负数的补码在反码的基础上加1。 | |
数值0只有一种表示方法,补码适合数字加减运算。 | ||
取值范围~-1,8位长度时范围~。 |
原码 | 反码 | 补码 | |||||
正数 | 负数 | 负数 | 负数 | ||||
0 | 0000 | -0 | 1000 | -0 | 1111 | -0 | 数据溢出 |
1 | 0001 | -1 | 1001 | -1 | 1110 | -1 | 1111 |
2 | 0010 | -2 | 1010 | -2 | 1101 | -2 | 1110 |
3 | 0011 | -3 | 1011 | -3 | 1100 | -3 | 1101 |
4 | 0100 | -4 | 1100 | -4 | 1011 | -4 | 1100 |
5 | 0101 | -5 | 1101 | -5 | 1010 | -5 | 1011 |
6 | 0110 | -6 | 1110 | -6 | 1001 | -6 | 1010 |
7 | 0111 | -7 | 1111 | -7 | 1000 | -7 | 1001 |
数据的表示-机器码 | ||
移码 | 在补码的基础上,符号位取反。(符号位用“1”表示正数,用“0”表示负数) | |
数值0只有一种表示方法,移码适合浮点运算 |
移码 | 补码 | 移码 | 补码 | ||||
正数 | 正数 | 负数 | 负数 | ||||
0 | 1000 | -0 | 0000 | -0 | 数据溢出 | -0 | 数据溢出 |
1 | 1001 | -1 | 0001 | -1 | 0111 | -1 | 1111 |
2 | 1010 | -2 | 0010 | -2 | 0110 | -2 | 1110 |
3 | 1011 | -3 | 0011 | -3 | 0101 | -3 | 1101 |
4 | 1100 | -4 | 0100 | -4 | 0100 | -4 | 1100 |
5 | 1101 | -5 | 0101 | -5 | 0011 | -5 | 1011 |
6 | 1110 | -6 | 0110 | -6 | 0010 | -6 | 1010 |
7 | 1111 | -7 | 0111 | -7 | 0001 | -7 | 1001 |
小结
数据的表示-机器码 | ||
原码 | 用0表示正数,用1表示负数,最高位为符号位。数值0可分为+0和-0。 | |
运算时将数值位和符号位分开处理。 | ||
取值范围~,8位长度时范围~。 | ||
反码 | 正数的反码就是原码 | |
负数的反码是在原码的基础上,符号位不变,对其余位逐位变反 | ||
补码 | 正数的补码与原码相同、负数的补码在反码的基础上加1。 | |
数值0只有一种表示方法,补码适合数字加减运算。 | ||
取值范围~-1,8位长度时范围~。 | ||
移码 | 在补码的基础上,符号位取反。(符号位用“1”表示正数,用“0”表示负数) | |
数值0只有一种表示方法,移码适合浮点运算 |
练习
【例1-5】若机器字长n等于8,则用原码表示[+1][-1][+127][-127][+45][-45][+0.5][-0.5]
=0000 0001 =1000 0001
=0111 1111 =1111 1111
=0010 1101 =1010 1101
=0◇100 000 =1◇100 000 (其中◇是小数点的位置)
【例1-6】若机器字长n等于8,则用反码表示[+1][-1][+127][-127][+45][-45][+0.5][-0.5]
=0000 0001 =1111 1110
=0111 1111 =1000 0000
=0010 1101 =1101 0010
=0◇100 000 =1◇011 111(其中◇是小数点的位置)
【例1-7】若机器字长n等于8,则用补码表示[+1][-1][+127][-127][+45][-45][+0.5][-0.5]
=0000 0001 =1111 1111
=0111 1111 =1000 0001
=0010 1101 =1101 0011
=0◇100 000 =1◇100 000 (其中◇是小数点的位置)
【例1-8】若机器字长n等于8,则用移码表示[+1][-1][+127][-127][+45][-45][+0][-0]
=1000 0001 =0111 1111
=1111 1111 =0000 0001
=1010 1101 =0101 0011
=1000 0000 =1000 0000 (其中◇是小数点的位置)
4.定点数和浮点数
定点数:表示数据时小数点的位置固定不变。小数点的位置通常有两种约定方式“定点正数”和“定点小数”。
定点正数:纯整数,小数点在最低有效数值位之后。
定点小数:纯小数,小数点在最高有效数值位之前。
特点:定点数所能表示的数值范围比较小,运算中很容易因结果超出范围而溢出。
表1-3 机器字长n时各种码制表示的带符号数的范围 | ||
码制 | 定点整数 | 定点小数 |
原码 | ~ | ~ |
反码 | ~ | ~ |
补码 | ~ | ~ |
移码 | ~ | ~ |
练习
将313D,要求用定点整数表示,n=16
313D=100111001B
=0000 0001 0011 1001
=0000 0001 0011 1001
=0000 0001 0011 1001
=1111 1110 1100 0110
将-0.825D,要求用定点小数表示,
首先需要确定定点小数的格式。假设我们使用一个字节(8位)来表示定点小数,并且约定小数点后占用4位(这只是为了说明,实际应用中可以根据需要调整小数点位置)。
首先,将-0.875转换为二进制小数。这个数的绝对值0.875可以转换为二进制小数0.111(简化表示,实际二进制可能更长或需要舍入)。
原码就是符号位加上真值的绝对值,即第一位表示符号,其余位表示数值本身。对于负数,符号位为1。所以-0.875的原码为:1.1110
反码是对原码除符号位外的各位取反。对于-0.875,其反码为:1.0001
补码是对反码加1。对于-0.875,其补码为:1.0010
移码通常用于浮点数的指数部分,并且是对补码的一个简单变换,即将补码的符号位取反。对于定点小数本身,移码不是一个常见的表示方法,但如果我们要按照移码的定义来转换-0.875的补码,其移码为:0.0010
请注意,这里的移码表示并不符合IEEE 754浮点数标准中的移码定义,因为在那里移码是专门用于表示指数的。在定点数表示中,我们通常不使用移码。
浮点数:小数点位置不固定的数,浮点表示法能表示更大范围的数。
浮点数(Floating-point number)是一种用于表示实数的计算机数值表示法。它允许数字有小数点,因此可以表示很大或很小的数值,同时提供一定的精度。浮点数的表示方法使得数字可以在计算机中以科学计数法的形式存储,有一个可变的“浮点”,即小数点可以根据需要移动。
浮点数的表示通常由三个部分组成:
- 符号位(Sign bit):指示数是正数还是负数。通常用一个比特来表示,0代表正数,1代表负数。
- 指数部分(Exponent):表示小数点应该移动的位置,用来确定数值的范围(即数量级)。指数通常以偏移或移码的形式存储,以便能够表示正数和负数指数。
- 尾数部分(Mantissa 或 Fraction):表示数的有效数字,它决定了数值的精度。尾数通常是一个二进制小数,省略了最高位的1(隐含的1),以节省存储空间。
在IEEE 754浮点数标准中,定义了单精度(32位)和双精度(64位)两种格式的浮点数。这个标准被广泛应用于现代计算机和编程语言中。
- 单精度浮点数(Single Precision):
- 符号位:1位
- 指数部分:8位(偏移量为127)
- 尾数部分:23位
- 双精度浮点数(Double Precision):
- 符号位:1位
- 指数部分:11位(偏移量为1023)
- 尾数部分:52位
举个例子,如果我们想要表示十进制数-5.75为一个单精度浮点数,我们可以这样做:
- 转换为二进制:
-5.75
变为-101.11
(二进制)。 - 规范化:将小数点移动到第一个非零比特之后,得到
-1.0111
,同时记录移动了2位。 - 转换为浮点数格式:
- 符号位:1(因为是负数)
- 指数部分:
2 + 127 = 129
(偏移127),二进制为10000001
- 尾数部分:
.0111
(隐含了前面的1),填充到23位,如01110000000000000000000
因此,-5.75的单精度浮点数表示大致为 1 10000001 01110000000000000000000
(实际的表示可能因舍入而有所不同)。
浮点数的使用允许我们在计算机中进行高精度的数学运算,但也需要考虑舍入误差、溢出和下溢等问题。
一个含小数点的二进制数可以表示位更一般的形式:
在浮点数表示法中,阶码通常为带符号的纯整数,尾数为带符号的纯小数。浮点数的表示格式一般如下:
阶符 | 阶码 | 数符 | 尾数(F) |
浮点数所能表示的数值范围主要由阶码决定,所表示数值的精度由尾数决定。
工业标准IEEE754
该标准的表示如下:
S | P | M |
其中,S为数的符号位,为0时表示正数,为1时表示负数;P为指数(阶码),用移码表示(偏移值为,为阶码的位数);M为尾数,用原码表示。
对于阶码为0或225的情况,IEEE754标准有特别的规定:
若P为0且M为0,则表示真值±0(正负号和数符位有关)
如果P=225并且M是0,则这个数的真值为±∞(与符号位有关)
如果P=225并且M不是0,则这不是一个数(NaN)
表1-4 3种形式的IEEE 754浮点数 | |||
参数 | 单精度浮点数 | 双精度浮点数 | 扩充精度浮点数 |
浮点数字长 | 64 | 80 | |
尾数长度 | 52 | 64 | |
符号位长度 | 1 | 1 | |
阶码长度 | 11 | 15 | |
指数偏移量 | +1023 | +16383 | |
可表示的实数范围 | ~ | ~ | ~ |
对于单精度浮点数和双精度浮点数,约定小数点左边隐含有一位,通常这位数就是1,因此尾数为1.××…×。
【例1-9】利用IEEE 754 标准将数表示为单精度浮点数。
解:
- 将数值转换为二进制:
整数部分 176 转换为二进制是10110000
。 小数部分 0.0625 转换为二进制是.0001
(因为 0.0625 = 1/16 = )。
因此,176.0625 的二进制表示是10110000.0001
。 - 规范化:
将二进制数10110000.0001
转换为科学计数法的形式:
- 设置IEEE 754格式的各个部分:
- 符号位:0(表示正数)
- 指数位:7(实际指数)+ 127(偏移量)= 134,转换为二进制是
10000110
- 尾数位:隐含前导的1,剩余部分
.01100000001
,填充到23位为01100000001000000000000
- 组合这些部分形成32位单精度浮点数:
这就是176.0625按照IEEE 754标准表示的单精度浮点数。请注意,在实际的计算机系统中,浮点数的表示可能受到舍入、硬件限制等因素的影响,但在这个例子中,176.0625可以精确表示,所以不存在舍入问题。
5.十进制数与字符的编码表示
数值、文字和英文字母等都被认为是字符,任何字符被录入计算机后,都必须转换成二进制表示形式,称为字符编码。
表1-5 8421BCD码、余3码、格雷码与十进制数的对应关系 | |||
十进制数 | 8421BCD码 | 余3码 | 格雷码 |
0 | 0000 | 0011 | 0000 |
1 | 0001 | 0100 | 0001 |
2 | 0010 | 0101 | 0011 |
3 | 0011 | 0110 | 0010 |
4 | 0100 | 0111 | 0110 |
5 | 0101 | 1000 | 1110 |
6 | 0110 | 1001 | 1010 |
7 | 0111 | 1010 | 1000 |
8 | 1000 | 1011 | 1100 |
9 | 1001 | 1100 | 0100 |
格雷码的应用
- 错误检测:由于相邻的格雷码只有一位不同,因此它可以用于检测单比特错误。
- 轴角编码器:在旋转编码器中,格雷码用于表示旋转位置,由于相邻位置只有一位变化,这可以减少由于机械接触不稳定而引起的读数错误。
- 模拟到数字的转换:在模数转换器中,使用格雷码可以减少由于量化误差引起的噪声。
- 遗传算法:在计算机科学中,格雷码也被用于某些优化算法,如遗传算法,因为它可以帮助算法更有效地搜索解空间。
6.ASCII码
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种用于信息交互的标准代码,它被开发出来,用于在文本文件中表示英文字符、数字和特殊符号。ASCII码使用7位(一个字节,但通常存储为一个8位的字节,最高位为0)来表示一个字符,因此它可以表示128个(2^7)不同的字符。
表1-6 7位ASCII代码表 | ||||||||
位 | 位 | |||||||
000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | |
0000 | NUL | DLE | SP | 0 | @ | P | 、 | p |
0001 | SOH | DC1 | ! | 1 | A | Q | a | q |
0010 | STX | DC2 | " | 2 | B | R | b | r |
0011 | ETX | DC3 | # | 3 | C | S | c | s |
0100 | EOT | DC4 | $ | 4 | D | T | d | t |
0101 | ENQ | NAK | % | 5 | E | U | e | u |
0110 | ACK | SYN | & | 6 | F | V | f | v |
0111 | BEL | ETB | , | 7 | G | W | g | w |
1000 | BS | CAN | ( | 8 | H | X | h | x |
1001 | HT | EM | ) | 9 | I | Y | i | y |
1010 | LF | SUB | * | : | J | Z | j | z |
1011 | VT | ESC | + | ; | K | [ | k | { |
1100 | FF | FS | ' | < | L | \ | l | | |
1101 | CR | GS | - | = | M | ] | m | } |
1110 | SO | RS | . | > | N | ↑ | n | ~ |
1111 | DI | US | / | ? | O | ↓ | o | Del |
例如:
字符0的ASCII码值位 011 0000 ()
字符a的ASCII码值位 110 0001 ()
7.汉字编码
对汉字进行编码。汉字处理包括汉字的编码输入、汉字的存储和汉字的输出等环节。
1. 输入码(外码)
输入码是用于将汉字输入到计算机中的编码方式。主要有以下几种类型:
(1)数字编码
- 区位码:是一种简单的数字编码方式,将汉字按照一定的规则排列在一个表格中,每个汉字对应一个唯一的行号和列号(区号和位号)。例如,汉字“啊”的区位码可能是1601,其中16是区号,01是位号。
(2)拼音码
- 全拼:即汉字的完整拼音,如“中”字的全拼是“zhong”。
- 简拼:是拼音的缩写形式,通常取每个字的拼音首字母,如“中国”可以简拼为“zg”。
- 双拼:是一种将拼音的声母和韵母分别用一个字母表示的输入法,旨在提高输入效率。
(3)字形编码
- 五笔字型:根据汉字的字形结构,将其拆分为若干个基本笔画或部首,并为每个笔画或部首分配一个代码,通过这些代码的组合来输入汉字。
- 郑码:由我国著名文字学家、《说文解字》研究权威郑易里先生独创,包含了《说文解字》中全部汉字的一个汉字编码方案。
2. 内部码(机内码或存储码)
- 国标码:为了统一不同系统间的汉字编码,我国制定了国家标准《信息交换用汉字编码字符集》(GB2312-80),其中规定了6763个汉字的编码,称为国标码。国标码是用于汉字信息交换的标准编码。
- 机内码:计算机内部实际使用的汉字编码,通常是在国标码的基础上加上一定的偏移量得到的,以确保与ASCII码不冲突。
3. 字形码(字模码或输出码)
- 字形码是用于描述汉字字形信息的编码,它决定了汉字在屏幕上或打印机上的输出效果。每个汉字的字形码通常由一系列点阵信息或矢量信息组成,用于指导显示或打印设备如何绘制该汉字。
综上所述,汉字编码涉及多个环节和多种编码方式,每种方式都有其特定的应用场景和优势。在实际应用中,需要根据具体需求和系统环境选择合适的编码方式。
8.Unicode
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode 的主要特点和目标:
- 统一性:Unicode 试图为所有语言中的所有字符提供一个统一的编码标准,这样无论是英文、中文、日文、阿拉伯文,还是其他任何语言的字符,都有一个唯一的编码。
- 兼容性:Unicode 设计时考虑了与现有编码标准的兼容性,尤其是 ASCII 编码。实际上,Unicode 编码的前 128 个字符与 ASCII 字符完全相同。
- 可扩展性:随着新字符和新语言的发现,Unicode 提供了扩展机制来包含这些新字符。
- 跨平台性:Unicode 不依赖于特定的系统或应用程序,因此它可以在不同的操作系统、应用程序和硬件平台上使用。
Unicode 编码方案:
Unicode 提供了几种不同的编码方案来存储 Unicode 字符,包括 UTF-8、UTF-16 和 UTF-32。这些编码方案在存储效率和兼容性之间做出了不同的权衡。
- UTF-8:一种变长的编码方案,可以用1到4个字节来表示一个 Unicode 字符。它对于 ASCII 字符非常高效(只使用1个字节),并且兼容 ASCII 编码。UTF-8 在互联网上广泛使用。
- UTF-16:也称为 UCS-2 的超集,使用2个或4个字节来表示一个 Unicode 字符。UTF-16 在处理大多数常用字符时效率较高,且在很多操作系统和应用程序中得到支持。
- UTF-32:使用固定的4个字节来表示每个 Unicode 字符。这种编码方案简单直接,但相对于其他方案,它在存储和传输效率上可能较低。
Unicode 的应用:
Unicode 广泛应用于现代计算机系统和应用程序中,包括但不限于:
- 网页开发:HTML 和 CSS 支持 Unicode 字符,使得多语言内容的展示成为可能。
- 文本编辑和处理:大多数现代文本编辑器和处理器都支持 Unicode,允许用户输入、编辑和显示多种语言的文本。
- 数据库存储:数据库系统通常支持 Unicode,以便能够存储和查询多语言数据。
- 软件开发:编程语言和环境通常支持 Unicode 字符串,以便处理多语言文本。
Unicode 的广泛采用极大地促进了全球信息的交流和共享。
表1-7 UCS-2到UTF-8的编码对应关系 | |
UCS-2编码(十六进制) | UTF-8字节流(十六进制) |
0000-007F | 0xxxxxxx |
0080-07FF | 110xxxxx 10xxxxxx |
0800-FFFF | 1110xxxx 10xxxxxx 10xxxxxx |