计算机内部的所有信息都是以二进制形式存在的
1.补码
正数的补码是自身
负数的补码是负数的原码除符号位外的反码再+1
负数的补码和原码转换都可以使用↑这条方法
为什么使用补码?
答:cpu只能进行加法运算,在进行加法运算的过程中出现负数,减去一个负数等于加上这个负数的补码。
默认规则
在规定长度的二进制数中, 如果最高位为1, 那么之后的二进制数为补码形式存储.
0 没有补码
2.左移和右移
左移n位等同把该数字*2的n次幂,高位溢出,低位补0
右移n位分为
一、逻辑右移:高n位补0,低n位舍去
二、算数右移:
正数,高n位补0,低n位舍去,等同于除以2的n次幂;
负数,高n位补1,低n位舍去。
3.浮点数的存储方式
运算浮点数的时候, 想要安全的使用, 就要尽量规避小数运算.
以下是一个比较极端和理想化的场景.
示例代码, 操作浮点数, 运行结果是10吗?
int main() {
float sum = 0;
int i = 0;
for (i = 0; i < 100; i++) {
sum += 0.1;
}
printf("%f\n", sum);
return 0;
}
由于cpu的不同,不同电脑进行浮点数的运算得到的结果往往是不同的
修改后的代码
int main() {
float sum = 0;
int i = 0;
for (i = 0; i < 100; i++) {
sum += 0.1 * 10;
}
printf("%f\n", sum / 10);
return 0;
}
其他知识点
1.二进制的运算可以先每四位化成一位十六进制数再来进行运算。
2.对于十进制数11
二进制表示 00001011 -> 前面位数补完
八进制表示 013 -> 最前面加个0表示八进制
十六进制表示 0xB -> 十六进制前面加0x