无符号数没有符号位,每一位都用来存放数字。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”的数
对于n位数,模M的大小 = n位数全为1后并在最末位加1。
- n位整数(包括符号位):M = 2n
- n位小数(包括符号位):M = 2
纯小数补码表示:
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
原则:弃高位,留低位
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
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 × 16的点阵来表示,即32个字节