算术操作符其实就是加,减,乘,除
移位操作符其实就是左移操作符,右移操作符 << >>
位操作符 按位或| 按位与& 按位异或^
算术操作符
+
-
*
\
%
加 减 乘 除 取模
对于除号
整形的除法 1/2 商0 余1
浮点型的除法 1.0/2 0.5 想要实现浮点数的除法,必须里面有1个是浮点数
1/2.0 1.0/2.0
取模操作符 :计算的整除后的余数
#include<stdio.h>
int main()
{
int c = 7 % 2;
int w = 6 / 3;
printf("%d\n%d", c, w);
return 0;
}
取模操作符的两端必须是整数
移位操作符
移动操作符移动的是二进制位数
十进制
0到9组成
八进制
0到8组成
二进制
0和1组成
十六进制
0到9 a到d表示
整数的二进制表示有3种
原码,反码,补码
正的整数的原反补码都相同
负的整数的原反补码需要进行计算
7是整数,4个字节,32个bit位
7写成二进制位数
0000 0000 0000 0000 0000 0000 0000 0111
7的最高位是0表示他是正数
最高位为1表示他是负数
0000 0000 0000 0000 0000 0000 0000 0111 原码
0000 0000 0000 0000 0000 0000 0000 0111 反码
0000 0000 0000 0000 0000 0000 0000 0111 补码
-7
100000000000000000000000000000000111
根据负7的二进制序列直接写出他的原码
反码,原码的符号位不变,其他位按位取反就是反码
111111111111111111111111111111111000
补码:原码的基础上加1
111111111111111111111111111111111001
整数在内存中存储的是补码
所以说移位操作符移的是我们内存中的补码
左移操作符的规则
左边丢弃,右边补0
如果是负数呢
-7
100000000000000000000000000000000111原码
111111111111111111111111111111111000反码
111111111111111111111111111111111001补码
-7<<1
移动操作符移动的补码
也就是-7的补码
右边补0,左边丢弃
111111111111111111111111111111111001 补码
111111111111111111111111111111110010 补码移动完的样子
因为我们看到的都是原码,这时候 就要把这个补码换算成反码然后就是原码
111111111111111111111111111111110001反码
100000000000000000000000000000001110 原码
得到的答案是-14
负数左移一位相当于原本的值乘以2
float f 3.14
注意左移右移操作符只针对整数
上面我们讲的是左移操作符
下面我们讲右移操作符
算术移位:右边丢弃,左边补原符号位
逻辑移位 :右边丢弃,左边补0
右移一位7是怎么移的 (因为是正数所以原反补相同)
0000 0000 0000 0000 0000 0000 0000 0111(补码)
0000 0000 0000 0000 0000 0000 0000 0011 移位移成这样,不管采用逻辑移位还是算术移位都是补0
#include<stdio.h>
int main()
{
int c=7>>1;
printf("%d\n",c);
return 0;
}
要想测试移位操作符用的是哪种移位方法
把负数右移测试就可以了
假设我们用-7
如果是算术移位
右边丢弃,左边补原符号位
100000000000000000000000000000000111
111111111111111111111111111111111000
111111111111111111111111111111111001(补码)
拿到了补码
这时候右移
原符号位因为是负数补1
111111111111111111111111111111111100(补码右移完了)
这时候要换算成原码
先反码
111111111111111111111111111111111011
再原码
100000000000000000000000000000000100
这时候得到的值是-4
如果算出的是-4就是算术移位
如果是逻辑移位
还是-7
1000000000000000000000000000000000111
1111111111111111111111111111111111000
1111111111111111111111111111111111001(补码)
这时候右移(是使用逻辑移位)
右边丢弃,左边直接补0
0111111111111111111111111111111111100(补码)
0111111111111111111111111111111111011 (反码)
0000000000000000000000000000000000100(原码)
这时候得到的是4
如果是4就是逻辑移位
#include<stdio.h>
int main()
{
int c=-7>>1;
printf("%d\n",c);
return 0;
}
算出来是-4所以vs使用的是算术移位
一般都是算术移位
注意移位的时候不要移动负数,移动负数是编译器都不知道怎么办的,是未定义的
(编译器直接无语:你小子想让我干啥)(什么移动浮点数位什么都不要想,只能移动整数)