【C语言】算术运算符、移位操作符、位操作符详细讲解。

时间:2022-10-11 12:19:38

????write in front????   

????大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流????

????2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 星级博主~掘金⇿InfoQ~51CTOP创作者~周榜92﹣总榜886⇿全网访问量35w+????

????本文由 謓泽 原创 发布在51CTOP 如需转载还请通知⚠

????个人主页-​謓泽51Ctop的博客​????

????欢迎各位→点赞???? + 收藏⭐️ + 留言????

????系列专栏-​謓泽51Ctop的分类_51CTO博客​????

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本????

【C语言】算术运算符、移位操作符、位操作符详细讲解。

????算术运算符 

???? 加法运算符("+")

  • 又称之为 双目运算符,即应该有两个变量参加运算,具有右结合性。描述:把两个操作数相加。

​#include<stdio.h> int main(void){ printf("Arabic numerals = %d",1+1); return 0; }​

运行结果:Arabic numerals = 2


???? 减法运算符("-")

  • 又称之为 双目运算符,但"-"也可作负值运算符,此时为单目运算符。描述:从第一个操作数中减去第二个操作数。

​#include<stdio.h> int main(void){ printf("Arabic numerals = %d",1-1); return 0; }​

运行结果:Arabic numerals = 0


???? 乘法运算符("*") 

  • 又称之为 双目运算符,具有左结合性。描述:把两个操作数相乘。

​#include<stdio.h> int main(void){ printf("Arabic numerals = %d\n",2 * 2); return 0; }​

注意:数学上的是乘法(x),而在我们编程当中是星号(*)。

运行结果:Arabic numerals = 4


???? 除法运算符("/")

  • 又称之为 双目运算符,具有左结合性。参与运算量均为整型时,结果也为整型,舍 去小数。如果运算量中有一个是实型,则结果为双精度实型。描述:分子除以分母。

注意:数学上的是除法(÷),而在我们编程当中的是斜杠(/)。

下面用代码演示下:除法演示

​#define #include <stdio.h> int main(void){ int a = 10; int a1 = 10; int b = 3; float b1 = 3.0; int c = a / b; float c1 = a / b1; printf("Take integer = %d\n", c); printf("Take decimal = %lf\n",c1); return 0; }​

上述????代码编译运行结果:

【C语言】算术运算符、移位操作符、位操作符详细讲解。


???? 取模运算符("%") 

  • 描述:分子除以分母,例如:8%3 = 2

注意:取模操作符是只能对整数进行取模的,而不能对小数进行取模运算。

取模运算符练习:算出 100~200 当中能被 2 除以的数字打印出来,并且用 count 计次打印出来的总数。代码示例显示如下:

​#include <stdio.h> int main(void){ int i; int Count = 0; for (i = 100; i <= 200; i++) { if (i % 2 == 0) { printf("%d ", i); Count++; } } printf("\nCount = %d\n", Count); return 0; }​

上述????代码编译运行结果:

【C语言】算术运算符、移位操作符、位操作符详细讲解。


????移位操作符 

  • 二进制左移运算符("<<"),将一个运算对象的各二进制位全部左移若干位 (左边的二进制位丢弃,右边补0)
  • 注:高位丢弃,低位补0。
  • 二进制右移运算符(">>"),将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。算数右移补的是最高位的数字,逻辑右移补的都是0。注意:我们通常都是采用的是算数右移的方式!
  • 注:低位丢弃,高位补0『正数补0、负数补1』

​<<(左移):最高位丢弃,最低位补0 >>(右移)如下↓ 1.无符号数(unsigned):最低位丢弃,最高位补0 2.有符号数(signed):最低位丢弃,最高位补符号位.(★) 注:取决于数据类型​

例如 A = 2,A<<1,得到的数字是:4

  • 00000000000000000000000000000010
  • 00000000000000000000000000000100

例如 A = 2,A>>1,得到的数字是:1

  • 00000000000000000000000000000010
  • 00000000000000000000000000000001

注意:在按位移动的时候,我们要移动正常的位数,你可不能移动100位那就出大问题

 ⚠:对于移位运算符,不要移动负数位,这个是标准当中未定义的。 

  • 例如

​int num = 2; num << -5; //错误​


????位操作符 

???? 按位与运算符("&")

  • 双目运算符。其功能是参与运算的两数各对应的二进位相与,只有对应的两个二进位均为 1 时,结果位才为 1,否则为 0。参与运算的数以补码方式出现。

运算规则

0&0=0;   
0&1=0;
1&0=0;
1&1=1;

【C语言】算术运算符、移位操作符、位操作符详细讲解。

例如:9 & 5,代码如下所示:

#include <stdio.h>
int main(void){
int a = 9; //00001001 - 9
int b = 5; //00000101 - 5
int c = a & b; //00000001 - 1
printf("number = %d\n", c);
return 0;
}

【C语言】算术运算符、移位操作符、位操作符详细讲解。

  • 运行结果:number = 1

???? 按位或运算符("|")

  • 双目运算符。其功能是参与运算的两数各对应的二进位相或。只要 对应的二个二进位有一个为 1 时,结果位就为 1。参与运算的两个数均以补码出现。

运算规则

0|0=0;   
0|1=1;
1|0=1;
1|1=1;

【C语言】算术运算符、移位操作符、位操作符详细讲解。

例如:9 & 5,代码如下所示:

#include <stdio.h>
int main(void){
int a = 9; //00001001 - 9
int b = 5; //00000101 - 5
int c = a | b; //00001100 - 12
printf("number = %d\n", c);
return 0;
}

【C语言】算术运算符、移位操作符、位操作符详细讲解。

  • 运行结果: number = 1

???? 按位异或运算符("^") 

  • 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。
  • 相同为0,一个数字异或上了0就相当于本身的那个数字。

运算规则

0^0=0;   
0^1=1;
1^0=1;
1^1=0;

【C语言】算术运算符、移位操作符、位操作符详细讲解。

例如:将 a = 9 和 b = 5 的值进行交换,不能创建变量进行交换!代码如下所示:

#include <stdio.h>
int main(void){
int a = 9;
int b = 5;
printf("交换之前:a = %d b = %d\n", a, b);
a = a ^ b; // 1001 ^ 0101 = 1100 (12)
b = a ^ b; // 1100 ^ 0101 = 1001 (9)
a = a ^ b; // 1100 ^ 1001 = 0101 (5)
printf("交换之后:a = %d b = %d\n", a, b);
return 0;
}

【C语言】算术运算符、移位操作符、位操作符详细讲解。

从上面代码我们可以知道,按位异或(^),可以不用创建临时变量达到交换两个数字的值。 

  • 运行结果:交换之前:a = 9    b = 5 换行a = 5    b = 9
  • 注:位操作符都必须是整数