操作符详解

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的补码为321
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.若要改变内存中的值,可以通过 '=' 将运算结果放入内存中

以上是关于操作符详解的主要内容,如果未能解决你的问题,请参考以下文章

使用移位进行除法的问题

你以为你真的了解二进制吗?详解JDK中的二进制骚操作

JMeter数据库操作详解

Python基础学习第十一节 内置函数详解

lua 二进制的移位运算

PHP - 仅当余数为 0 时才执行(和回显)操作 - 进入无限循环