二进制之间的加法
例如:
1101 + 0011 = 10000 ----》 13 + 3 =16
二进制的加法很简单,只要记住逢2进1
二进制的减法
例如:1101-0011
计算机中进行运算不能退位补位(只有进位,所以程序异常有溢出,没有少了),只能转换为 1101 +(-0011)
所以 ,在计算机中如何表示负数?
计算机中只有一长串的引脚,每一个引脚是一个位,每一个引脚可以存储一个二进制的值。计算机通过一个个引脚来表示数值。我们规定一个固定的长度(8,16,32位)来表示一个数值,规定的长度之后,拿它最前面的一位来表示符号。0代表是正数,1代表负数。
比如 用 1 1000101 ,表示-69 ,但是这样运算存在问题
0011 (3)+1001(-1)=1100(-4) 结果错误 ,因此 -1用1001表示会存在运算问题,因此我们提出了补数。在运算减法的时候先计算出补数再进行相加。
补数的计算:取反后再加1 ,因此-1表示为1111
二进制的乘除
我们想在计算机中确定一个数,首先得确定它的长度(8,16,32,64),然后确定全存储(全是正数),还是要表示负数(当表示负数,最高位为1时,之后存储的数值是以补码的形式存储)。
长度是硬性的,可以是任意位。但是需要一个合理的值,如果用2位表示负数,表示的数非常有限。长度决定了数的表示范围。
左移: 左移一位 ,数值乘以2
右移: 0100 右移1位 0010 除以2 。
如果是一个负数 1000 0000 (-128)右移两位, 如果右移补0 ,会得到00100000 ,因此,必须把首位跟着右移过去,补数右移前面补1 。
所以,在右移时,有逻辑右移和算术右移。
逻辑右移 : 不管正数负数,右移时在前面补0。
算术右移:右移时,根据符号位来决定是补0还是补1
二进制的逻辑运算:
与(and): 两者都为1(真) 时 为 1(真)
或(or): 两者都为0(假) 时 为 0(假)
非(not): 1 ->0 , 0->1
异或: 不同为1
二进制数表示浮点数
看如下代码
int main()
{
float sum =0;
for(int i =0;i<100;i++)
{
sum += 0.1;
}
printf("%f",sum);
return 0;
}
运行结果为10.000002为什么会出现这种情况?
二进制表示小数时 ,比如 0.9 用二进制表示 0.111......,会丢失一定的数据,计算机计算浮点数不可能准确的
如何处理这种情况
1. 不去处理,只要对程序不产生影响 忽略掉精度不对的情况,
2.不拿小数运算 (极端情况),乘以相应的倍数
例如:(以前程序)
int main()
{
float sum =0;
for(int i =0;i<100;i++)
{
sum += 0.1 *10;
}
printf("%f",sum/10);
return 0;
}