当前位置:网站首页>【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、按位与、按位或、按位异或操作的数必须都为整数。
欢迎大家的收看,今天的内容到此结束了,让我们一起期待下一篇文章的到来吧!!!
如果喜欢,那就一键三连吧!!!
边栏推荐
猜你喜欢
How to quickly compare two byte arrays for equality in .NET
二叉搜索树的实现
.NET performance optimization - you should set initial size for collection types
包管理工具Chocolate - Win10如何安装Chocolate工具、快速上手、进阶用法
用了TCP协议,就一定不会丢包吗?
模糊查询like用法实例(Bee)
Jar包启动通过ClassPathResource获取不到文件路径问题
A brief discussion on the transformation of .NET legacy applications
Bee 事务注解 @Tran 使用实例
封装和包、访问修饰权限
随机推荐
解道6-编程技术3
交 叉 数 组
增删改查这么多年,最后栽在MySQL的架构设计上!
ECCV 2022 | ByteTrack: 简单高效的数据关联方法
Informatics Olympiad All-in-One (1260: [Example 9.4] Intercepting Missiles (Noip1999))
Zabbix 5.0 Monitoring Tutorial (2)
如何理解 swing 是非线程安全 (原创)
Day12 接口和协议
博客主题美化第二弹
HCIP--路由策略实验
golang刷leetcode: 在每个树行中找最大值
golang刷leetcode:道路的最大总重要性
一款免费的容器安全 SaaS 平台使用记录
golang刷letcode:公平分发饼干
[C题目]力扣1. 两数之和
Li Mu hands-on learning deep learning V2-bert and code implementation
VisualStudio 制作Dynamic Link Library动态链接库文件
Jar包启动通过ClassPathResource获取不到文件路径问题
树形结构构造示例代码
A brief discussion on the transformation of .NET legacy applications