当前位置:网站首页>【c】操作符详解(一)
【c】操作符详解(一)
2022-08-02 21:02:00 【silence-Tan】
哈喽大家好,大家好 !
我是Mr.tan
今天呢,给大家分享一些c语言中的操作符号,希望对大家学习c语言能有所帮助。
一、算数运算符
| 操作符: | 描述: | 用法案例: | 结合性: |
| + | 加法 | a + b | R-L |
| - | 减法 | a - b | R-L |
| * | 乘法 | a * b | R-L |
| / | 除法 | a / b | R-L |
| % | 整数取余 | a % b | R-L |
对于加法、减法、乘法我想大家已经再熟悉不过了,所以我们直接看代码以及运行结果:
1、加法
int main()
{
int a = 10;
int b = 5;
int c = a + b;
printf("%d", c);
return 0;
}
2、减法
int main()
{
int a = 10;
int b = 5;
int c = a -b;
printf("%d\n", c);
return 0;
}
3、乘法
int main()
{
int a = 10;
int b = 5;
int c = a *b;
printf("%d\n", c);
return 0;
}
4、除法
当我们看到下面两个代码的运行结果,发现最后打印的都是2,为什么会出现这种情况呢?大家都知道在数学运算中“10/4=2.5”,但是你认为在数学中的运算结果与c语言编译器中的运行结果是一样的?那当然不是,当我们把两个变量都定义为int类型的时候,相除打印出来的也是一个整形数据。
//代码1
int main()
{
int a = 10;
int b = 5;
int c = a / b;
printf("%d\n", c);
return 0;
}

//代码2
int main()
{
int a = 10;
int b = 4;
int c = a / b;
printf("%d\n", c);
return 0;
}

当遇到这样的问题,很多人都想问,有没有一种办法能让在数学中的结果与c语言编译器打印出来的结果是一样的呢?答案是“有”,那么请看下面这段代码:
int main()
{
printf("%f\n", 10.0/4);
printf("%f\n", 10 / 4.0);
printf("%f\n", 10.0 / 4.0);
return 0;
}
int main()
{
double a = 10;
double b = 4;
printf("%f\n", a/b);
return 0;
}
从上面两个代码的运行结果中可以看出,当我们想得出与数学表达式结果一样的值时,我们有两种方法:
- 除法想得到小数的结果,必须保证除数与被除数中至少有一个是小数(浮点数);
- 当初始化变量时,将变量初始化为double类型或者float类型的数据
5、整数取余
对于整数取余运算,两个操作数必须为整数,当我们给它浮点型数据时,编译器会给我们报错。
int main()
{
5 % 2;
}

所以我们在对于整数取余操作时,要注意%两边应为整数,而整数取余的返回值为整除之后的余数。
int main()
{
printf("%d\n",5 % 2);
return 0;
}

![]()
二、移位操作符
在c中,移位运算符<<(左移)和>>(右移)。移位运算符组成的表达式也属于算术表达式,它的值为算术值。左移运算是将一个二进制位的操作数按给定的位数向左移动,移出位被丢弃,右边移出的空位一律补0。右移运算是将一个二进制位的操作数按给定的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,正数的符号位为0,负数的符号位为1。
| 操作符 | 描述: | 用法案例: | 结合性 |
| << | 左移操作符 | num << 1 | L-R |
| >> | 右移操作符 | num >> 1 | L-R |
1、左移操作符
(1)、用法规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
(2)、语法格式:需要移位的数字 << 移位的次数(例如:4 << 1,则是将数字4左移1位)。
(3)、计算过程:
首先把4转换为二进制数字00000000 00000000 00000000 00000100,然后把该数字高位(左侧)的零移出,其他的数字都朝左平移1位,最后在低位(右侧)的空位补零。则得到的最终结果是00000000 00000000 00000000 00001000,则转换为十进制是8。
int main()
{
int a = 4;
int b = a << 1;
printf("%d\n",b);
return 0;
}

以上为整数的左移操作,接下来同样给大家演示一遍负数的左移操作:
首先把-4转换为二进制数字10000000 00000000 00000000 00000100,然后将其二进制原码转换为反码11111111 11111111 11111111 11111011,再将其反码转换为补码11111111 11111111 11111111 11111100,数字高位(左侧)的一移出,其他的数字都朝左平移1位,最后在低位(右侧)的空位补零。则得到的为所求值的补码11111111 11111111 11111111 11111000,再将所求得补码减1求反码,反码为11111111 11111111 11111111 11110111,然后将反码转换为原码,最终结果是10000000 00000000 00000000 00001000,则转换为十进制是-8。
int main()
{
int a = -4;
int b = a << 1;
printf("%d\n",b);
return 0;
}
2、右移操作符
右移分为逻辑右移(右边丢弃,左边补0)和算术右移(右边丢弃,左边补符号位)。对于右移采用逻辑右移和算术右移,c语言没有给出明确的答案,具体取决于编译器,但是大部分编译器都用算术数右移,所以下面所举的案例都采用算术右移。
(1)、用法规则:按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
(2)、语法格式:需要移位的数字 >> 移位的次数(例如:4 >> 1,则是将数字4右移1位)。
(3)、计算过程:
-4 >> 1
首先把-4转换为二进制数字10000000 00000000 00000000 00000100,然后将其二进制原码转换为反码11111111 11111111 11111111 11111011,再将其反码转换为补码11111111 11111111 11111111 11111100,数字低位(右侧)的一个零移出,其他的数字都朝右平移1位,最后在高位(左侧)的空位补1。则得到的为所求值的补码11111111 11111111 11111111 11111110,再将所求得补码减1求反码,反码为11111111 11111111 11111111 11111101,然后将反码转换为原码,最终结果是10000000 00000000 00000000 00000010,则转换为十进制是-2。
4 >> 1
首先把4转换为二进制数字00000000 00000000 00000000 00000100,然后把该数字低位(右侧)的零移出,其他的数字都朝右平移1位,最后在高位(左侧)的空位补符号位。则得到的最终结果是00000000 00000000 00000000 00000010,则转换为十进制是2。

int main()
{
int a = -4;
int b = a >> 1;
printf("b = %d\n",b);
int c = 4;
int d = c >> 1;
printf("d = %d\n",d);
return 0;
}

三、位操作符
| 操作符: | 描述: | 用法案例: | 结合性: |
| & | 按位与 | num & num | L-R |
| | | 按位或 | num | num | L-R |
| ^ | 按位异或 | num ^ num | L-R |
1、按位与
只有对应的两个二进制位都为1时,结果位才为1,否则结果为0。
3 & -5
3的二进制补码为00000000 00000000 00000000 00000011,-5的二进制补码为11111111 11111111 11111111 11111011,两数的二进制补码进行按位与操作,所得结果为00000000 00000000 00000000 00000011,将其转化为十进制数为3。
2、按位或
只有对应的两个二进制位都为0时,结果位才为0,否则结果为1。
3 | -5
3的二进制补码为00000000 00000000 00000000 00000011,-5的二进制补码为11111111 11111111 11111111 11111011,两数的二进制补码进行按位或操作,所得结果为11111111 11111111 11111111 11111011,将其补码化为原码的形式,然后转化为十进制数的时候为-5。
3、按位异或
只有对应位置的二进制为的两个数相同时为0,相反则为1。
3 ^ -5
3的二进制补码为00000000 00000000 00000000 00000011,-5的二进制补码为11111111 11111111 11111111 11111011,两数的二进制补码进行按位异或操作,所得结果为11111111 11111111 11111111 11111000,将其补码化为原码的形式,然后转化为十进制数的时候为-8。
int main()
{
int a = 3;
int b = -5;
int c = a & b;//按位与
int d = a | b;//按位或
int e = a ^ b;//按位异或
printf("c = %d\n",c);
printf("d = %d\n", d);
printf("e = %d\n", e);
return 0;
}
总结:
1、整数的原码、反码与补码相同;负数的反码:符号位不变,其余取反;负数的补码:补码加1所得到的就是负数的补码;
2、整数在内存中是以二进制补码的形式存储的;
3、“<<”、“>>”移位操作符,移动的是存储在内存中的补码;
4、按位与、按位或、按位异或操作的数必须都为整数。
欢迎大家的收看,今天的内容到此结束了,让我们一起期待下一篇文章的到来吧!!!
如果喜欢,那就一键三连吧!!!
边栏推荐
猜你喜欢
随机推荐
golang刷leetcode:按位与结果大于零的最长组合
JumpServer open source bastion machine completes Loongson architecture compatibility certification
Informatics Olympiad All-in-One (1259: [Example 9.3] Find the longest non-descending sequence)
Vscode快速入门、 插件安装、插件位置、修改vscode默认引用插件的路径、在命令行总配置code、快捷键
手把手教你干掉if else
js how to get the browser zoom ratio
Swin Transformer 论文精读,并解析其模型结构
MSTP与STP
Which thread pool does Async use?
并发与并行
Common tools and test methods for interface testing (Introduction)
华为设备配置BFD多跳检测
总结嵌入式C语言难点(2部分)
用户之声 | 大学生的“课外学堂”
Intensive reading of the Swin Transformer paper and analysis of its model structure
用户之声 | GBASE南大通用实训有感
2018HBCPC个人题解
Details in C# you don't know
30天啃透这份Framework 源码手册直接面进大厂
"Weekly Translate Go" This time we have something different!-- "How to Code in Go" series launched









