操作符详解
Posted 语风之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作符详解相关的知识,希望对你有一定的参考价值。
一、算数操作符
+(加) -(减) *(乘) /(除) %(取余)
1. / 除
对于 / 操作符如果两个操作数都是整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
printf("%d\\n",1/4);
printf("%f\\n",1/4.0);
2. % 取余
% 操作符的两个操作数都必须为整数
,返回的数是整除后的余数。
二、移位操作符
<<(左移操作符) >>(右移操作符)
注意:
移位操作符作用对象为二进制,其中负数运算时需转换为补码
例-12
二进制共32位,最高位为符号位,正数为0,负数为1。原码除了符号位各位取反得到反码,反码末位加1得到补码。
原码:
1000 0000 0000 0000 0000 0000 0000 1100
反码:
1111 1111 1111 1111 1111 1111 1111 0011
补码:
1111 1111 1111 1111 1111 1111 1111 0100
1. 左移操作符
左边抛弃,右边补0;
int num=10;
num<<1;
二进制操作结果:
0000 0000 0000 0000 0000 0000 0000 1010
0 0000 0000 0000 0000 0000 0000 0001 0100
int num = 10;
num<<;
printf("%d\\n", num);
printf("%d\\n", num<<1);
运算中内存与寄存器的关系
实际上,无论左移,还是右移都是在通过内存数据拷贝到寄存器中再进行运算的,因此左移后内存中内容不变,而在寄存器中内容经过左移变为20。
说明图:
运行结果:
2. 右移操作符
右移运算分两种
1.对无符号数 逻辑移位,左边用0补充,右边丢弃
2.对有符号数 算数移位,左边用原该值的符号位填充,右边丢弃
算数右移与逻辑右移,例-1
若对负数逻辑右移,则结果为2147483647,结果错误
int num=-1;
此时内存中存储-1的补码为32个1
1111 1111 1111 1111 1111 1111 1111 1111
算数右移:左边用该值的符号位 1 填充
1111 1111 1111 1111 1111 1111 1111 1111 1
逻辑右移:左边补0
0111 1111 1111 1111 1111 1111 1111 1111 1
三、 位操作符
操作数必须为整数;针对二进制数对应位,按位操作
&(按位与) |(按位或) ^(按位异或)
1. & 按位与
二进制数对应位都为1则为1,有0则为0
2. | 按位或
二进制数对应位有1则为1,无1则为0
3. ^ 按位异或
二进制数对应位同则0,异则1
0与任何数异或都是那个数本身
所以 ^ 也可以用来进行值交换
int a = 12;
int b = 31;
a ^= b;
b ^= a;
a ^= b;
printf("a的值:%d\\n", a);
printf("b的值:%d\\n", b);
过程详解:
运行结果:
四、 赋值操作符
'='的本质是将运算结果放入内存中
'='具有结合性,在连续赋值时从右向左赋值,a的值变为21,x的值也变为21。
int a=10;
int x=0;
int y=20;
a=x=y+1;
printf("a的值:%d\\n",a);
printf("x的值:%d\\n",x);
printf("y的值:%d\\n",y);
五、重点谨记
1.牢记运算是将内存中数据拷贝到CPU寄存器后在寄存器中进行运算的,所以寄存器中的运行结果不会影响到内存中的数值
2.若要改变内存中的值,可以通过 '=' 将运算结果放入内存中
以上是关于操作符详解的主要内容,如果未能解决你的问题,请参考以下文章