算术操作符:
算术操作符有:加法+ 减法- 乘法* 除法/ 取余%
算术操作符该注意的点:
1.除了%操作符之外,其他的操作符都可以作用于整数和浮点数。
2.对于/操作符来说,两个数都是整数的话,结果只能是整数,如果其中一个是浮点数的话,那结果也是浮点数。
3.%操作符的两个数必须是整数,返回的是整除之后的余数。
移位操作符:
<< : 左移操作符
>> :右移操作符
注意:移位操作符只能操作整数!
整数在内存中二进制的补充:
在详细了解操作符之前我们要知道移位操作符移动的是二进制的位。
对于一个整数四个字节就是32个bit位,二进制也是32个bit位(类如:1 在内存中是00000000 00000000 00000000 00000001)。
在内存中存储的二进制位,思考负数是怎么存储的?所以32个bit位最左边的叫做符号位
符号位为1就是负数,为0就是正数。(补充:无符号整数,没有符号位,都是有效位)
原码:就是整数的原本二进制位的样子。
反码:原码的符号位不变,其他位取反
补码:反码的二进制加1
整数在内存中的存储都是补码的形式,计算也是用的补码。(提示:负数在内存中是补码的形式,如果想知道是什么负数需要计算!补码变原码也是取反加1)
对于正整数来说,三码相同,负数需要计算
1.左移操作符
移位操作符移动的都是整数在内存中的存储的补码
左移操作符的规则:左边抛弃,右边补0
类如:
但是实际上num的值没发生改变,因为没赋值。
2.右移操作符
右移操作符分两种:
1.逻辑移位:左边用0填充,右边不要
2.算术移位:左边用原值的符号位填充,右边不要
关于这两种移位方式,取决于用的是哪种编译器。
因为我们常用是VS,而VS用的是算术移位。
注意:对于这两种移位操作符,不要移动负数位,这个C语言标准没定义的,类如:
int num = 10;
num >> -1;
位操作符:
位操作符也是操作的是二进制位。
位操作符有:
1.&:按位与
按位与是对应的二进制位,类如:
int main()
{int a = 10;int b = 1;int c = a & b;printf("%d", c);
}
结果怎么是0的,我们来看看:
补充:按位与1,就可以知道我们数字在内存中二进制位中的最后一位是1还是0了。
2.| : 按位或:
和按位与的相同道理,但是按位或的规则是:
1 | 1 = 1 , 1 | 0 = 1 , 0 | 0 = 0。
3.^ : 按位异或:
相同为0,相异为1.
这个按位异或有一些特殊的:
类如:a ^ a = 0 a ^ 0 = a。
一些特殊题:
不创建临时变量或者第三个变量,交换两个变量的值:
这道题就需要我们的按位异或:
int main()
{int a = 10;int b = 8;printf("a = %d\n", a);printf("b = %d\n", b);a = a ^ b;b = a ^ b;a = a ^ b;printf("a = %d\n", a);printf("b = %d\n", b);
}
怎么会这样的?
按位异或支持交换律的,所以第一个a = a ^ b , 第二个的时候我们把 a 替换成 a ^ b 带进去算:
b = a ^ b : a ^ b ^ b ,因为 b ^ b = 0 ,所以 a ^ 0 = a,所以 b = a 。第三个我们也把 a = a ^ b
b = a 带进去算,所以 a = a ^ b : a ^ b ^ a,所以一样的,这两个数值就交换了。
留下一道题大家可以自己试一试:求一个整数在内存中二进制位中有多少个1