目录
一. 移位计算
(1)算数移位
(2)逻辑移位
(3)循环移位
二. 乘法运算
(1)原码的乘法运算
(2)补码的乘法运算
三. 除法运算
(1)原码的除法运算
(2)补码的除法运算
四. C语言中的类型转换
五. 数据的存储和排列
(1)大小端模式
(2)边界对齐
一. 移位计算
(1)算数移位
移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法。
r进制,右移k位小数点,相当于乘以,左移k位小数点,相当于除以。
a.原码的算数移位―—符号位保持不变,仅对数值位进行移位。
- 右移:高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位不等于0,则会丢失精度。
- 左移:低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位不等于0,则会出现严重误差。
b.反码的算数移位
正数的反码与原码相同,因此对正数反码的移位运算也和原码相同。
- 右移:高位补0,低位舍弃。左移:低位补0,高位舍弃。
负数的反码数值位与原码相反,因此负数反码的移位运算规则需要调整。
- 右移:高位补1,低位舍弃。左移:低位补1,高位舍弃。
c.补码的算数移位
正数的补码与原码相同,因此对正数反码的移位运算也和原码相同。
- 右移:高位补0,低位舍弃。左移:低位补0,高位舍弃。
负数补码=反码末位+1,导致反码最右边几个连续的1都因进位而变为0,直到进位碰到第一个0为止。(负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码)
- 右移(同反码):高位补1,低位舍弃。左移(同原码):低位补0,高位舍弃。
(2)逻辑移位
逻辑右移:高位补0,低位舍弃。逻辑左移:低位补0,高位舍弃。
(3)循环移位
二. 乘法运算
(1)原码的乘法运算
二进制的手算过程:
原码一位乘法:机器字长n+1,数值部分占n位。符号位通过异或确定;数值部分通过被乘数和乘数绝对值的n轮加法、移位完成根据当前乘数中参与运算的位确定(ACC)加什么。若当前运算位=1,则(ACC)+[|x|]原;若=0,则(ACC)+0。每轮加法后ACC、MQ的内容统一逻辑右移(ACC左边补零,MQ右面移除的位丢弃)。
已经确定的乘积,也叫部分积。
(2)补码的乘法运算
补码的乘法运算和原码极为类似,但有以下不同:
举例:
设机器字长为5位(含1位符号位,n=4) , x=-0.1101,y= +0.1011,采用Booth算法求x*y
x[补]=11.0011,[-x]补=00.1101,[y]补=0.1011
三. 除法运算
(1)原码的除法运算
设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101,采用原码恢复余数法求x/y,
x=0.1011,y=0.1101,[|y|]补=0.1101,[-|y|]补=1.0011
符号单独处理:符号位=被除数和除数的符号位取异或,数值位取绝对值进行除法计算。
实现方法:上商0/1,得到余数,余数末尾补0
左移n次,上商n+1次,最后一次上商余数不左移。
不恢复余数法:对恢复余数法的简化:
(2)补码的除法运算
设机器字长为5位(含1位符号位,n=4),x=+0.1000,y=-0.1011,采用补码加减交替除法求x/y。
[x]补=00.1000,[y]补=11.0101,[-y]补=00.1011
补码除法的规则:
- 符号位参与运算,被除数/余数、除数采用双符号位;
- 被除数和除数同号,则被除数减去除数。被除数和除数异号,则被除数加上除数;
- 余数和除数同号,商1,余数左移一位减去除数;余数和除数异号,商0,余数左移一位加上除数。
- 重复n次,末位商恒置1。
四. C语言中的类型转换
五. 数据的存储和排列
(1)大小端模式
大端方式:更容易人类理解;小端方式:更容易计算机实现读取。
(2)边界对齐
现代计算机通常是按字节编址,即每个字节对应1个地址,通常也支持按字、按半字、按字节寻址。假设存储字长为32位,则1个字=32bit,半字=16bit。每次访存只能读/写1个字: