高级语言程序->汇编语言程序->机器语言程序
计算机系统结构:外特性、程序员所见的属性,包括指令系统、数据表示、寻址方式、寄存器集
计算机组成:计算机系统结构所体现的属性的具体实现
冯诺依曼结构:以运算器为中心,程序顺序执行,指令和数据以同等地位存于存储器,按址寻访
运算器、控制器、存储器、输入输出
储存器的基本组成:
MAR:存储器地址寄存器,地址长度可反映存储器的容量
MDR:存储器数据寄存器,寄存器宽度反映存储字长
控制器基本组成:
PC:程序计数器,存放当前即将执行的指令地址
IR:指令寄存器,存放当前即将执行的指令
取指->译指->执指
术语:
指令字长:一条指令的二进制代码位数
存储字长:每次访问存储器获得的数据位数
机器字长:CPU同时处理的数据位数
CPU时间:CPU执行给定程序所花费的时间,不包括I/O等待时间
CPU执行时间:一个时钟周期长度指令数目平均每条指令所花的时钟周期
指令条数:取决于指令集体系结构,编译器的质量
CPI:执行一条指令所需时钟周期数
MIPS:每秒执行百万条指令数
FLOPS:每秒浮点运算次数
性能设计的基本原则:
大概率事件优先原则
Amdahl定律:加速某部件所获得的系统性能加速比受限于该部件在系统中所占的重要性
整数类型:short int long
整数的编码:原码、反码、补码
同时有无符号数与有符号数参加运算时,C编译器会隐含的将有符号整数强制转换到无符号数。数据在计算机中的储存不变,只是对数据的解释不同,符号位-2n变成2n
比如说0-1=-1(1111),会看成15
size_t表示无符号数,对于64位的机器,size_t类型数据取值范围是0~2^64-1
而unsigned int类型取值范围是0~2^32-1,所以一个unsigned int一定>=0
unsigned int加减法是模为Umax的算术运算,当你需要取模算术运算的时候再用unsigned
C语言中的按位运算:& | ^ ~
C语言中的逻辑运算符:&& || !
按位扩展:正数高位扩展是0,负数高位扩展是1,保留数值原来的含义
执行与、或操作是零扩展,默认是无符号数,为0扩展
addi加上立即数,andi与立即数
位截断:强行将长位数转成短位数,直接截断,正数可能变成负数
左移x<
逻辑右移:高位填0
算术右移:补符号位
C语言右移都是算术右移!!!想用>>实现逻辑右移就可以将操作数强制类型转化为unsigned类型
无符号数的加法:忽略最高位进位:1000+1001=0001
有符号数的加法:补码直接相加
整数运算的溢出:运算结果超出了表示范围
无符号数溢出不报错
有符号数:有硬件检测是否溢出overflow=carry[n]xor carry[n-1],C++可以catch
加法器实现乘法:速度慢
无符号数阵列乘法器电路
有符号数的乘法:乘数的补码的乘积不等于积的补码
但是,截断后的w位,是一样的->标准的乘法:忽略运算结果的高w位,无符号乘法的部件,可以给符号乘法使用
余数符号与被除数符号相同
(-7)/2=-3…-1
(-7)/(-2)=3…-1
通过右移实现处以2:正数负数都是商向下取整
因为除法指令太慢了,所以编译器优化就先加再右移
IEEE 754浮点数标准
8位阶码:1~ 254,但是要减去偏移量127,故阶码范围是-126~127
23位尾码:尾码表示小数,范围0~ 1,最后再加上1(阶码全零的话不用加1),范围是1~2,相当于提高了一位精度,故有效位数是24位,相当于7位十进制有效位数
规格化表示数值范围
非规格化表示
注意正零和负零之间的区别,正无穷的倒数是正零,负无穷的倒数是负零。
某种意义下比正无穷还大的数是NaN
11位阶码
52位尾码:有效尾数53位,相当于17位十进制有效位数
IEEE754属性:
几乎可以之间按编码大小来比较数值大小
向9截断
向正无穷截
向负无穷截
首选偶数
四舍五入:对于五的舍入,采用取偶数的方式
步骤:
对阶:小阶往大阶对
尾数相减
规格化,舍入
检查溢出
浮点数加法特性
步骤:
阶码加
尾数乘
规格化、舍入
检查溢出
浮点数乘法特性
int->double
只要int的值的bits<=53就能精确的转换
int->float
int的有效位数是31bits