C语言 操作符详解

目录

一、操作符的分类

二、二进制和进制转换

[2.1 二进制转十进制](#2.1 二进制转十进制)

[2.2 二进制转八进制](#2.2 二进制转八进制)

[2.3 二进制转十六进制](#2.3 二进制转十六进制)

三、原码、反码、补码

四、移位操作符

[4.1 左移操作符](#4.1 左移操作符)

[​编辑 4.2 右移操作符](#编辑 4.2 右移操作符)

五、位操作符

按位与:&

按位或:|

按位异或:^

按位取反:~

六、逗号表达式

七、操作符的属性

[7.1 优先级](#7.1 优先级)

[7.2 结合性](#7.2 结合性)


一、操作符的分类

这是操作符的种类,有很多种,今天讲的操作符中有⼀些操作符和⼆进制有关系,我们先铺垫⼀下⼆进制的和进制转换的知识。

二、二进制和进制转换

其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进制、10进制、16进制是数值的不同表示形式而已。

比如数值15的各种进制的表示形式:

15的2进制:1111

15的8进制:17

15的10进制:15

15的16进制:F

我们重点介绍⼀下⼆进制: 首先我们还是得从10进制讲起:

• 10进制中满10进1

• 10进制的数字每⼀位都是0~9的数字组成

其实⼆进制也是⼀样的

• 2进制中满2进1

• 2进制的数字每⼀位都是0~1的数字组成

那么 1101 就是⼆进制的数字了。

2.1 二进制转十进制

10进制的123表示的值是一百二十三,为什么是这个值呢?其实10进制的每⼀位是权重的,10进 制的数字从右向左是个位、十位、百位....,分别每⼀位的权重是10的0次方、10的1次方......

2进制和10进制是类似的

比如二进制中的1101:

2.2 二进制转八进制

8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就足够了,比如7的二进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀ 个8进制位,剩余不够3个2进制位的直接换算。

如:2进制的01101011,换成8进制:0153,0开头的数字,会被当做8进制。

2.3 二进制转十六进制

16进制的数字每⼀位是0~9,a~f的,0~9,a~f的数字,各自写成2进制,最多有4个2进制位就足够了,比如f的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进 制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。

如:2进制的01101011,换成16进制:0x6b,16进制表示的时候前面加0x

三、原码、反码、补码

整数的2进制表示方法有三种,即原码、反码和补码,有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位,剩余的都是数值位,符号位都是用0表示"正",用1表示"负"。

正整数的原、反、补码都相同负整数的三种表示方法各不相同

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。

对于整形来说:数据存放内存中其实存放的是补码:

在计算机系统中,数值⼀律用补码来表示和存储。原因在于,使用补码可以将符号位和数值域统⼀处理,同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

四、移位操作符

<<左移操作符

>>右移操作符

注意:移位操作符的操作数只能是整数

4.1 左移操作符

移位规则:左边抛弃、右边补0

#include <stdio.h>
int main()
{
 int num = 10;
 int n = num<<1;
 printf("n= %d\n", n);
 printf("num= %d\n", num);
 return 0;
}

4.2 右移操作符

移位规则:右移运算分两种:

1.逻辑右移:左边用0填充,右边丢弃

2.算术右移:左边用原该值的符号位填充,右边丢弃

#include <stdio.h>
int main()
{
 int num = 10;
 int n = num>>1;
 printf("n= %d\n", n);
 printf("num= %d\n", num);
 return 0;
}

逻辑右移

算数右移

五、位操作符

位操作符有:

& 按位与

| 按位或

^ 按位异或

~ 按位取反

按位与:&

按位与的定义是:同一二进制位上的数字都是1的话,&的结果为1,否则为0.

0 & 0 = 0;

0 & 1 = 0;

1 & 1 = 1;

不同大小的数据位操作的原则,低位对齐,高位补零。

按位或:|

定义:只要参与运算的双方其中有一个是1,结果就是1.同0才为0.

0 | 0 = 0;

0 | 1 = 1;

1 | 0 = 1;

1 | 1 = 1;

不同大小的数据位操作的原则,低位对齐,高位补零。

按位异或:^

只要参与运算的双方互异,结果就为1,否则为0.

0 ^ 1 = 1;

1 ^ 0 = 1;

1 ^ 1 = 0;

0 ^ 0 = 0;

不同大小的数据位操作的原则,低位对齐,高位补零。

按位取反:~

对一个二进制数进行取反。1变0,0变1.

​唯一需要注意的一点是,~的优先级是位运算符中最高的,必须优先计算。

六、逗号表达式

逗号表达式,就是用逗号隔开的多个表达式,逗号表达式,从左向右依次执行,整个表达式的结果是最后⼀个表达式的结果。

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式 

上述代码中,就是从左向右依次执行,最后的结果就是c的值。

七、操作符的属性

C语⾔的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。

7.1 优先级

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行,各种运算符的优先级是不⼀样的。

3 + 4 * 5;

上面示例中,表达式 3 + 4 * 5 里面既有加法运算符( + ),又有乘法运算符( * )。由于乘法的优先级高于加法,所以会先计算 4 * 5 ,而不是先计算 3 + 4 。

7.2 结合性

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。⼤部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符( = )。

5 * 6 / 2;

上面示例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执行,先计算 5 * 6 , 再计算 6 / 2 。

运算符的优先级顺序很多,下面是部分运算符的优先级顺序(按照优先级从高到低排列)

由于圆括号的优先级最高,可以使用它改变其他运算符的优先级。


本篇内容就先到这里了,操作种类繁多,我只挑了一部分写,希望对各位有帮助,如果有错误欢迎指出。

相关推荐
迷失蒲公英22 分钟前
XML与Go结构互转实现(序列化及反序列化)
xml·开发语言·golang
测试盐1 小时前
c++编译过程初识
开发语言·c++
赖赖赖先生1 小时前
fastadmin 框架 生成qr code 二维码图片,PHP 7.4版本
开发语言·php
玉红7772 小时前
R语言的数据类型
开发语言·后端·golang
夜斗(dou)2 小时前
node.js文件压缩包解析,反馈解析进度,解析后的文件字节正常
开发语言·javascript·node.js
觅远2 小时前
python+PyMuPDF库:(一)创建pdf文件及内容读取和写入
开发语言·python·pdf
神雕杨2 小时前
node js 过滤空白行
开发语言·前端·javascript
lvbu_2024war013 小时前
MATLAB语言的网络编程
开发语言·后端·golang
single5943 小时前
【c++笔试强训】(第四十五篇)
java·开发语言·数据结构·c++·算法
游客5203 小时前
自动化办公-合并多个excel
开发语言·python·自动化·excel