======================仰望星空 脚踏实地==========================
====================== lesson02 ==========================
1.复习
1)CPU的组成
2)二进制的基础演算
2.二进制的运算
1)加法:较为简单==>逢二进一
2)减法:变为加上一个负数(计算机做不了减法)
=>问题:那么计算机应该如何表示负数
=>解决办法:规定一个固定的长度表示数值,拿最前面的一个引脚(位)表示符号(0正1负)
=>出现问题:3+(-1)=0011+1001=1100=-4 (显然不对)
=>解决办法:补数
=>即:当为负数时,确定数值长度,取反(除符号位外,1变0,0变1)加1,再与另一数进行加法运算可得正确值。为什么可行?
=>计算机不会借位,溢出的会抛掉,例如3+(-1) (-1)的二进制表示为1001,取反得1110,加1得1111(补数)
=>所以3+(-1)=0011+1111=0010=(-2) (若你得到的值是10010,请记得,将超出长度那位的值抛掉)
=>关于补码(数):补码中的1000不代表-0,所代表的是当前能够代表的最小负数; 0没有补码。
=>在8位中,11111111 是最大的负数(-1) 10000000是最小的负数(-128)
3)乘法:通过左移实现:左边超出长度的数值抛掉,右边缺少数值的位用0补充
=>例:3>>2(左移2位) 0011>>2=1100=12=3*2^2
=>即:左移几位等于乘于几个2
4)除法:通过右移实现 即除于2^n
=>但是当数值为负数时,例如:1100右移2位 会变成0011 显然不对(负数变正数了)
=>对于除法有两种情况:算术右移和逻辑右移
=>算术右移:根据首位(符号位)补1或0 即:1100>>2=1111 即从(-4)变为(-1) 符合规则
=>逻辑右移:不管符号位,直接往右移n位,空位补0 如:1100>>2=0011 运用:LED屏流动文字/图像的实现
5)逻辑运算 ==>通过电路门实现
5.1 逻辑非:(not) 即1变0,0变1
5.2 逻辑与:(and) 两者都为1时为1 0&&0=0 、0&&1=0、1&&1=1
5.3 逻辑或:(or) 二者之间至少有一个为1,值就为1 0||0=0、0||1=1、1||1=1
5.4 逻辑异或:(xor) 两者数值不同时为真 00=0、11=0 、10=1
6)二进制表示浮点数(了解)
例(部分代码):
for(int i=0;i<100;i++)
{
sum+=0.1;
}
程序运行结果为sum=10.00002 ==>计算机计算浮点数很难达到准确,有部分准确(小数部分能被2^(-1)或2^(-2)......整除时)
对于此问题的处理方式:
=>安全的运算:不拿小数运算,如上例中,sum+=0.1*10,printf("%f",sum/10);
=>不管后面的 (不推荐这种方式)