无符号数
无符号数没有符号位,每一位都用来存放数字。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
B0001
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.000101乘数最后一位为1,加上x的绝对值
+0.110
—————————
0.110
>>0.0110|10将结果右移,移出部分移入乘数
+0.000乘数最后一位为0,加0
—————————
0.011
>>0.00110|1
+0.110
—————————
0.111
>>0.011110|
最后得到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
YnYn+1操作AY
10-X补000000010110
+110011
——————————
110011010110
>>
———————————————————
1 10011|01011
1110011|01011/*空出来的第2位和第1位保持一致*/
11+01110011|01011
>>
———————————————————
1 110011|0101
11110011|0101
01+X补11110011|0101
+001101
——————————
1 00100111|0101/*进位可以忽略不进*/
>>
————————————————————
0 0100111|010
000100111|010
10-X补000100
+110011
——————————
110111111|010
>>
————————————————————
1 10111111|01
1110111111|01
------------------校正-----------------------
01+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
————————————
100 1001/*恢复余数*/
<<
————————————
01 00100/*上商位移入商*/
01 0010
+11 0101
————————————
100 0111正01
<<
————————————
00 1110 01/*上商位移入商*/
00 1110
+11 0101
————————————
100 0011正011
<<
————————————
00 0110011/*上商位移入商*/
00 0110
+11 0101
————————————
11 1011负0110
+00 1011
————————————
100 0110/*恢复余数*/
<<
————————————
00 11000110/*上商位移入商*/
00 1100
+11 0101
————————————
100 0001正01101
<<
————————————
00 001001101/*上商位移入商*/
符号位: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补异号上商000100000000|
<<
——————————
0100000000| 0/*Q的位移入余数*/
+110110
——————————
1 000110
r1 Y补异号上商0000110
<<
——————————
001100000|0 0
+110110
——————————
1 000010
r2 Y补异号上商0000010000|00
<<
——————————
00010000|00 0
+110110
——————————
11101000|000
r3 Y补同号上商111101000|001
<<
——————————
1101000|001 0
+001010
——————————
1111100|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点阵来输出西文字符
汉字码
汉字输入码
使用输入设备将汉字输入到计算机而专门编制的代码
输入码
数字码
拼音码
字形码
数字输入码
用数字串代表汉字
优点
缺点无重码
代码难以记忆
输入码和内部码转换方便
国标码
将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区号
区内号
拼音输入码
以汉字拼音为基础的输入方法
优点
缺点简单方便
同音字多,重码率高
字形输入码
根据汉字的书写形状来进行编码,按照笔划用字母或数字进行编码,输入时按笔划顺序输入
优点
缺点简单方便,重码比拼音少
重码率高,需要熟悉字形结构
汉字的机内码
机器内部处理和存储汉字的代码。用两个字节来表示汉字
转换成16进制再加2020H
加8080H
转换成16进制再加A0A0H
10进制区位码
国标码
机内码
汉字字模码
用于显示输出或打印输出。用点阵表示汉字字形。至少需要16 × 16的点阵来表示,即32个字节