C语言 操作符详解

敲代码的奥豆 2024-08-14 08:05:02 阅读 83

目录

一、操作符的分类

二、二进制和进制转换

 2.1 二进制转十进制

 2.2 二进制转八进制

 2.3 二进制转十六进制

 三、原码、反码、补码

四、移位操作符

4.1 左移操作符

​编辑 4.2 右移操作符

五、位操作符

按位与:&

按位或:|

按位异或:^

按位取反:~

六、逗号表达式

七、操作符的属性

7.1 优先级

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

<code>#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.算术右移:左边用原该值的符号位填充,右边丢弃

<code>#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.

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

六、逗号表达式

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

<code>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 。 

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

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


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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。