移位运算
逻辑移位:在不丢失高位的情况下,左移乘二,右移除2
例:-4逻辑右移不为-2
算术移位: 左移时把高位移入到C位中,右移时根据符号位补充,最低位移入C位
循环移位: 把移出的位放到另外一边(可以用于加密)
位扩展:
unsigned char 8位
unsigned short 16位
unsigned int 32位
unsigned long 32/64位
二进制的乘除
无符号数乘法:原码一位乘法运算单元
用加法运算和定长寄存器做乘法: 看乘数最后一位,如果 是0,乘右移,如果是1,加上被乘数后右移。计算过程的移位次数为乘数的位数。
有符号原码数乘法
符号单独异或,数值相乘
补码一位乘法(Booth算法)
1.符号位参与计算
2.采用补码进行计算
3.被乘数X 一般取双符号位参与计算,并且让部分积P初始值为0,长度与被乘数X相同,乘数Y可取单符号位
4.开始计算时,乘数Y末尾增设附加位(Yn+1),值为0
5.移位规则(移位看乘数后两位(包括附加位),部分积右移时补位看最高位,超出的进位丢弃,移位n次,移出位n个)
移位规则:
•00/11部分积右移⼀位(即加0再右移⼀位)
•01 部分积加[X]补,且右移⼀位
•10 部分积加[-X]补,且右移⼀位
以4位有效bit为例:乘数移出4bit,处理过4次规则。
定点数原码除法(恢复余数)
1、商的符号为两数符号异或
2、值为两数绝对值除
例:01100111÷1001
1、将除数和被除数对齐
2、商清0
3、被除数减对齐后的除数得到部分被除数
4、如果部分被除数为正,则商左移补1.
5、如果部分被除数为负,则商左移补0. 并将小于0的部分被除数加上对齐后的除数
6、对除数右移,并重复第3到第5,直到减原被除数为负,
7、最后的负部分被除数加上原除。
定点数补码除法(加减交替)
1、符号位参与运算,且采用双符号位。
2、若被除数与除数同号,则被除数减除数;否则就加上除数。
3、余数与除数同号,商加1左移,余数左移减去除数;余数与除数异号,商加0左移,余数左移加上除数。
4、重复第3步n次
5、商末位恒置1,余数右移n位。
浮点数
浮点数其实是两个值的乘积,而且表示并不唯一。
IEE754浮点数标准
三种浮点数表示:
- 32位单精度浮点数
- 64位双精度浮点数
- 临时实数
规格化浮点数:小数点前面必须是1,左规(x2),右规(÷2)
1、当尾数为-1/2时,尾数的补码为11.100…0. 虽然这在1~1/2区间,但是不满足补码的规格化形式,因
而不是规格化数。
2、当尾数为-1时,尾数的补码是11.00…0, 因为小数补码允许表示-1,所以特别规定-1为规格化数。
3、0的尾数是全0.
补码的缺点:在比较大小时,因为有符号位而出现错误
--对所有值$+2^n$后再比
移码表示范围:0~$2^{n+1}-1$
符号位 | 阶码 | 尾数 | 总位数 | 最大指数 | 最小指数 | 指数偏移量 | |
---|---|---|---|---|---|---|---|
单精度(短实数) | 1 | 8 | 23 | 32 | +127 | -126 | +127 |
双精度(长实数) | 1 | 11 | 52 | 64 | +1023 | -1022 | +1023 |
临时实数 | 1 | 15 | 64 | 80 | +16383 | -16382 | +16383 |
短实数:$2^{-126}$~$2^{127}$*$(2-2^{-23})$
长实数:$2^{-1022}$~$2^{1023}$*$(2-2^{-52})$
- 规格化:正常计算规则
- 非规格化
- 表示0和很小的数:E全为0,M全为1
- 正负无穷大:E全为1,M全为0
- NaN:E全为1,M不全为0
IEE754中定义的4种舍入
- 舍入到最接近:舍入到最接近,在一样接近的情况下偶数优先
- 朝+∞方向舍入:会将结果朝正无限大的方向舍入
- 朝-∞方向舍入:会将结果朝负无限大的方向舍入
- 朝0方向舍入:会将结果朝0的方向舍入
浮点数的加减
步骤:
1.对阶:低阶向高阶对齐
2.尾数求和(差)
3.规格化处理
4.舍入
5.溢出判断
编程中需注意
因为精度损失,可能会导致:
1.浮点加法不具有结合性
2.$x^2-y^2$和(x+y)*(x-y)不一定相等
3.类型转换可能发生精度损失
浮点运算中的误差
1.乘法的相对误差比加法大
2.两个浮点数判断相等时,不能使用==,而要用abs
文本信息处理
ASCII码
字符集:ASCII编码定义了128个字符,包括大小写英文字母、数字0-9、标点符号、控制字符(如换行、回车)以及⼀些其他符号。
编码方式:每个ASCII字符被分配了⼀个从0到127的数字编码。例如,大写字母“A”的ASCII编码是65,小写字母“a”的编码是97。
⼆进制表示:ASCII字符使用7位二进制数来表示,这意味着每个字符可以用⼀个字节(通常是8位)中的7位来表示。例如,字母“A”的⼆进制表示是01000001。
控制字符:ASCII中的控制字符用于文本控制。例如,字符编码为10的“换行”(LF)用于表示文本行的结束。
兼容性:由于ASCII仅使用7位,它可以在8位字节的系统中使用而不会引起兼容性问题。这使得ASCII在早期计算机系统中非常流行。
局限性:ASCII仅能表示英语字母和基本符号,它无法表示其他语言的字符。
Unicode编码
全球一致,广泛
UTF-8编码特点
1到4个字节,包含控制码和字符码。
乱码
编码规则不一致