1、操作符分类:
算术操作符 + - * / %
移位操作符 << >>
位操作符 & | ^
赋值操作符 = += -= ......
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
2、算术操作符
+ - * / %
/ 整型的除法 1/2-->0 得到的是商
浮点型的除法 1.0/2-->0.5 1/2.0-->0.5 1.0/2.0-->0.5
% 计算的是整除后的余数 7%2 就是7除2商3余1,最后得到的结果是1,%这个取模操作符的两 端必须是整数。
3、移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
移位操作符,移动的是二进制位
给一个值13,可以用二进制,八进制,十进制,十六进制等来表示。
十进制里面的数字每一位都是由0~9来组成
二进制里面只有0和1
八进制是0~7组成
十六进制是由0~9和a~f来表示,a~f就是10~15
整数的二进制表示有3种:
原码
反码
补码
规定:
正的整数的原码、反码、补码相同;
负的整数的原码、反码、补码是要计算的。
例:
7
二进制序列:111 (但其实不够)
7是个整数,整型占4个字节,4个字节就是32比特位(bit),一个字节8个bit,所以
二进制序列应该是:00000000000000000000000000000111
因为7是整数,所以高位是0,0表示他是整数,最高位就是符号位,(最高位是0,表示他是整数,最高位是1,表示他是负数)
所以这个00000000000000000000000000000111就是7的原码,照着7的这个值直接写出来的这个数值就是她的原码,因为正的整数的原码、反码、补码相同,所以也可以认为这个00000000000000000000000000000111是7的反码,补码。
7
00000000000000000000000000000111 --原码
00000000000000000000000000000111 --反码
00000000000000000000000000000111 --补码
-7
10000000000000000000000000000111 --原码 (最高位1表示负数)
负数的反码:原码的符号位不变,其他位按位取反
111111111111111111111111111111111000 --反码
负数的补码:反码的基础上直接+1
111111111111111111111111111111111001 --补码
整数在内存中存储的是补码
正数 左移操作符:
左移操作符的计算规则:左边丢弃,右边补0。
a的值是不变的。
负数 左移操作符:
那通过补码算到原码(这是负数的)
补码-1之后再取反
111111111111111111111111111111110010 --补码
111111111111111111111111111111110001 --反码
10000000000000000000000000001110 --原码
-(1*(2^3)+1*(2^2)+1*(2^1)+1*(2^0))=-(8+4+2+0)=-14
左移有乘2的效果
右移操作符:
(有两种,算术移位和逻辑移位)
算术移位:右边丢弃,左边补原符号位
逻辑移位:右边丢弃,左边补0
正数现在好像测不出它现在用的是算术移位还是逻辑移位。
那怎么测它是是算术移位还是逻辑移位,放个负数就明白了。
a=-7
移位之后,如果是算术移位最高位补的就是1,是负数
如果是逻辑移位最高位补的就是0,变成是正数了。
111111111111111111111111111111111100 --补码
111111111111111111111111111111111011 --反码
10000000000000000000000000000100 --原码 -(1*2(2^2))=-4
说明vs2022编译器采用的是算术右移。
警告:
对于移位运算符,不要移动负数位,这个标准是未定义的。 (int b=a>>-2; //这个是不行的)