数值和字符表示 数位扩展和压缩 算术运算

无符号数

无符号数没有符号位,每一位都用来存放数字。n位无符号数的表示范围是0~2n-1。
二进制和八进制,十六进制之间可以快速转换

二进制 八进制
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
二进制 十六进制
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F

例:0x001BFEAB转换为二进制数

1 B F E A B
0001 1011 1111 1110 1010 1011

有符号数

真值:带“+”,“-”符号的数
机器数:将“+”,“-”数字化为“0”,“1”的数

原码表示法

  • 符号位为0表示正数,1表示负数
  • 数值位即真值的绝对值。
    [+0]= 0 0000000
    [-0] = 1 0000000

反码表示码

  • 正数的反码与原码相同
  • 负数的反码符号为“1”,数值部分求反
    [+0]= 0 0000000
    [-0] = 1 1111111

补码表示法

对于n位数,模M的大小 = n位数全为1后并在最末位加1。

  • n位整数(包括符号位):M = 2n
  • n位小数(包括符号位):M = 2
  • 正数的补码与原码相同
  • [+0] = [-0] = 0 0000000
  • 负数可以用它的正补数来代替,这个正补数可以用模加上负数本身求得。
  • 负数的补码符号为1,数值部分取反+1
  • n位补码能表示范围:-2n-2n-1

纯小数补码表示:
x = -0.1011,x = 2 - 0.1011 = 1.0101,最高位是符号位,小数点为隐含值。

例1:用8位补码形式表示十进制数-127
原码:11111111
反码:10000000
补码:10000001
例2:用8位补码形式表示十进制数-128
[-128]补 = M + (- 128) = 2 ^ 8 - 128 = +128 = 1000 0000
例3:已知8位补码1000 0000,将这个数转换为十进制有符号数
符号位为1,是负数
补码减1:0111 1111
取反:1000 0000
绝对值为128
十进制数为-128

数位扩展与压缩

符号扩展

直接把符号位填充到扩展位

800A( 32 bits ) -> FFFF800A( 64 bits )

0扩展

用于无符号数,高位都补0

位数压缩

原则:弃高位,留低位

F12B800A( 64 bits ) -> 800A( 32 bits )

算术运算

补码加减运算

  • 补码加法运算公式:[x] + [y] = [x + y]

  • 补码减法运算公式:[x] + [-y] = [x -y]

加法运算进位规则:满二进一 减法运算借位规则:借一当二,最高位不够借,照借不误
在这里插入图片描述

溢出判断

如果数值运算结果超出了所能表示的范围,产生溢出。两个符号相同的数相加,才可能产生溢出;两个符号相异的数相加,不可能产生溢出。

单符号法

对操作数和运算结果的符号位进行检测,当结果的符号位与操作数符号不相同时就表明发生溢出
设x的符号为Xf,y的符号为Yf,运算结果的符号为Sf
在这里插入图片描述
若V = 0无溢出,V = 1有溢出

进位判断法

对最高数据位进位和符号进位进行检测
设运算时最高数据位产生的进位为C1,符号位产生的进位为C0

V = C0 ^ C1

若V = 0无溢出,V = 1有溢出
例:

	0111 1111
+	        1
——————————————
	1000 0000

C1 = 1,C2 = 0,C1 异或 C2 = 1,溢出
8位补码1000 0000转换为十进制数为:-128

双符号法(变形补码法)

用两个相同的符号位表示一个数的符号。左边第一位为S1,相邻的为S2

  • 00表示正数
  • 01表示正向溢出
  • 11表示负号
  • 10表示负向溢出
V = S1 ^ S2

若V = 0无溢出,V = 1有溢出

如果运算结果发生溢出,S1为结果真正的符号位。

原码一位乘法

设x = xf x1 x2 ... xn,y = yf y1 y2 ... yn,乘积为P,乘积的符号位为Pf

Pf = xf ^ yf
|P| = |x| |y|

若yn = 1,部分积加上被乘数|x|,然后右移一位;
若yn = 0,部分积加上0,然后右移一位。

例:已知X = 0.110,Y = -0.101,用原码一位乘法求X·Y

[x]原= 00.110(用双符号表示)		[Y]原 = 1.101

	部分积		乘数	说明
	0.000		101		乘数最后一位为1,加上x的绝对值
+	0.110
—————————
	0.110
>>	0.011		0|10	将结果右移,移出部分移入乘数
+	0.000				乘数最后一位为0,加0
—————————
	0.011				
>>	0.001		10|1
+	0.110
—————————
	0.111
>>	0.011		110|

最后得到X·Y = (0 ^ 1)0.11 110 = 1.011110
						

补码一位乘法

Booth法:符号位参与运算
[XY] = [An] + (Y1-Y0) × [X]
乘数的最后两位作为参考位
移位操作让乘数只剩下自己原来的两位时循环结束。用最后剩下的两位校正结果。

Yn 高位 Yn+1 低位 运算操作
0 0 A右移一位
0 1 (A + X)右移一位
1 0 (A - X)右移一位
1 1 A 右移一位

An是累加数

例1:
X = +1101
Y = +1011
用补码一位乘法求XY

初始化积寄存器A = 00 0000(双符号位)
[X]补 = 01101
[Y]补 = 01011
[-X]补 = 10011

Yn	Yn+1	操作	A		Y
1	0		-X补	000000	010110
				+	110011
				——————————
					110011	010110
				>>
				———————————————————
					1 1001	1|01011
					111001	1|01011	/*空出来的第2位和第1位保持一致*/
					
1	1		+0		111001	1|01011
				>>
				———————————————————
					1 1100	11|0101
					111100	11|0101
					
0	1		+X补	111100	11|0101
				+	001101
				——————————
				1   001001	11|0101/*进位可以忽略不进*/
				>>
				————————————————————
				    0 0100	111|010
				    000100	111|010
				    
1	0		-X补	000100
				+	110011
				——————————
					110111	111|010
				>>
				————————————————————
					1 1011	1111|01
					111011	1111|01
					
------------------校正-----------------------
0	1		+X补	111011
				+	001101
				——————————
				1   001000

[XY]补 = 00100 1111

原码恢复余数除法

运算步数不能事先确定,通过相减来确定够不够减,不够减就要加回去(恢复余数)

例1:
X = +0.1001
Y = -0.1011
用原码一位除法求 X / Y

初始化商寄器Q = 0.0000
[X]原 =  00.1001
[|X|]补 = 0.1001	/*绝对值和符号位分开运算*/
[Y]原 = 1.1011 
[|Y|]补 = 00.1011
[-|Y|]补 = 11.0101

	余数		余数符号			商		上商
	00 1001		
+	11 0101
————————————
	11 1110		   负					0
+	00 1011
————————————
1	00 1001		/*恢复余数*/
<<  
————————————
	01 0010						0		/*上商位移入商*/

	01 0010
+	11 0101
————————————
1	00 0111			正			0		1
<<
————————————
	00 1110				   		01		/*上商位移入商*/

	00 1110
+	11 0101
————————————
1	00 0011			正			01			1
<<
————————————
	00 0110						011		/*上商位移入商*/	

	00 0110
+	11 0101
————————————
	11 1011			负			011			0
+	00 1011
————————————
1	00 0110		/*恢复余数*/
<<
————————————
	00 1100						0110	/*上商位移入商*/	

	00 1100
+	11 0101
————————————
1	00 0001			正			0110			1
<<
————————————
	00 0010						01101	/*上商位移入商*/

符号位:0 ^ 1 = 1
商 = 1.1101	

------------------校正-----------------
余数校正 = 0.0001 * 2 ^ -4

补码不恢复余数除法

被除数 X
除数 Y
余数 ri ,i = 0,1,...

补码不回复余数除法的使用条件:|X| < |Y|

令r0 = X
比较r0和Y符号,同号上商1,异号上商0
循环 i = 1...n

ri和Y的符号 ri+1 =
同号 1 [ri]左移一位再 - Y
异号 0 [ri]左移一位再 + Y

移位操作让商只剩下自己原来的一位时循环结束,进入校正。

结果校正:符号位+1,末尾恒置1
余数校正:左移n次,余数 = 2-n × rn

例1:
X = +0.1000
Y = -0.1010

初始化商寄存器Q = 0.0000
[X]补 =  00.1000
[Y]补 =  11.0110
[-Y]补 = 00.1010

条件			操作			余数		Q
r0 Y补异号		上商0			001000		00000|	
							<<	
							——————————
								010000		0000| 0	/*Q的位移入余数*/
							+	110110
							——————————
							1   000110
							
r1 Y补异号		上商0			000110
							<<
							——————————
								001100		000|0 0
							+	110110
							——————————
							1   000010
							
r2 Y补异号		上商0			000010		000|00
							<<	
							——————————
								000100		00|00 0
							+	110110
							——————————
								111010		00|000
								
r3 Y补同号		上商1			111010		00|001
							<<
							——————————
								110100		0|001 0
							+	001010
							——————————
								111110		0|0010
-------------------校正---------------------------
结果校正:	0|0010
		 +	1|0011
		 —————————
		 	1 0011
余数:2 ^ -4 × 111110

ASCII码

American Standard Code for Information Interchange
一个ASCII码字符占用1个字节的空间

b7 b6 ~ b0
奇偶校验位 字符编码

除开校验位,7位能表示27 = 128个字符。其中95个是可以被打印机打印的,剩下的33个是控制字符。

扩展后的ASCII码可以表示256个编码

通常采用8 × 8点阵来输出西文字符

汉字码

汉字输入码

使用输入设备将汉字输入到计算机而专门编制的代码

graph LR A[输入码] --> B[数字码] A --> C[拼音码] A --> D[字形码]

数字输入码

用数字串代表汉字

优点 缺点
无重码 代码难以记忆
输入码和内部码转换方便
国标码

将6763个汉字按照使用频率分为两级

第一级汉字 3755 按拼音排序
第二级汉字 3008 按部首排序
符号,数字,字母:682个
总计7445个
区位码

将国标码的字符按位置分为94个区,每区94位。区的编号 1 - 94,区内编号也是 1 - 94。

区号 内容 个数
1 - 9 图形字符区 682
10 - 15 空白区
16 -55 第一级汉字 3755
56 - 87 第二级汉字 3008
88 - 94 空白区
用4位数字串代表汉字输入
b3 - b2 b1 - b0
-- --
区号 区内号

拼音输入码

以汉字拼音为基础的输入方法

优点 缺点
简单方便 同音字多,重码率高

字形输入码

根据汉字的书写形状来进行编码,按照笔划用字母或数字进行编码,输入时按笔划顺序输入

优点 缺点
简单方便,重码比拼音少 重码率高,需要熟悉字形结构

汉字的机内码

机器内部处理和存储汉字的代码。用两个字节来表示汉字

graph LR A[10进制区位码] -- 转换成16进制再加2020H--> B[国标码] B -- 加8080H--> C[机内码] A --转换成16进制再加A0A0H --> C

汉字字模码

用于显示输出或打印输出。用点阵表示汉字字形。至少需要16 × 16的点阵来表示,即32个字节

posted @ 2020-03-29 12:52  LanceHansen  阅读(337)  评论(0编辑  收藏  举报