首页 > 其他分享 >C语言 操作符详解

C语言 操作符详解

时间:2024-08-07 14:56:19浏览次数:10  
标签:10 优先级 进制 C语言 运算符 详解 操作符 按位

目录

一、操作符的分类

二、二进制和进制转换

 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

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

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

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


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

标签:10,优先级,进制,C语言,运算符,详解,操作符,按位
From: https://blog.csdn.net/2401_86551514/article/details/140989726

相关文章

  • 《重生到现代之从零开始的C语言生活》—— 调试
    前言:调试是几乎每一个计算机行业的人员必备的技能,那么让我们来学习一下吧bugbug这个词好像出现在生活的很多地方,一般指在电脑系统中或程序中,隐藏着一些未被发现的缺陷和问题,简称程序漏洞调试(debug)我们发现bug后,下一步就是找到问题并修复问题,找问题的过程就是调试调试一......
  • 《重生到现代之从零开始的C语言生活》——函数递归
    递归啥是递归啊递归是解决问的一种方式,简单来说,就是函数自己调用自己递归解决问题把复杂的大问题转化为一个一个与原文题相似的小问题。递归的思想就是把大事化小在递归中,递就是递推,归就是回归递归中的限制条件递归必须存在限制条件,当满足这个条件时,递归不在继续每次......
  • 超详细明了的C语言函数递归,望周知。(包含求n的阶乘顺序打印⼀个整数的每⼀位求第n个斐
    1.递归是什么?递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。写⼀个史上最简单的C语⾔递归代码#include<stdio.h>intmain(){printf......
  • instanceof二元操作符
    instanceof是一个二元操作符,用于判断左边的对象是否是右边类或接口的一个实例。如果左边的对象是右边类或接口的实例,或者右边是左边对象的某个父类(包括接口的实现)的实例,则表达式的结果为true;否则为false。这个操作符在Java中非常有用,尤其是在处理多态和类型转换时。它允许你在......
  • 神经网络之卷积篇:详解边缘检测示例(Edge detection example)
    详解边缘检测示例卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例。在这个博客中,会看到卷积是如何进行运算的。在之前的博客中,说过神经网络的前几层是如何检测边缘的,然后,后面的层有可能检测到物体的部分区域,更靠后的一些层可能检测到完整的物体,这个例子中就是......
  • 4、Flink SQL 与 DataStream API 集成处理 Insert-Only 流详解
    处理Insert-Only流StreamTableEnvironment提供以下方法来从DataStream转换和转换到DataStream:fromDataStream(DataStream):将insert-only和任意类型的流转换为表,默认情况下不传播事件时间和水印。fromDataStream(DataStream,Schema):将insert-only和任意类型......
  • 深入解析:23种软件设计模式详解及其分类(创建型、结构型、行为型)附代码示例DEMO
    目录引言一、创建型模式1.简单工厂模式(SimpleFactoryPattern)2.抽象工厂模式(AbstractFactoryPattern)3.单例模式(SingletonPattern)4.建造者模式(BuilderPattern)5.原型模式(PrototypePattern)二、结构型模式1.适配器模式(AdapterPattern)2.桥接模式(BridgePatt......
  • HTTP报文:“请求报文“和“响应报文“详解
    在网络通信的世界里,HTTP协议扮演着至关重要的角色。它是客户端与服务器之间对话的语言,允许数据的请求和响应。本文将深入探讨HTTP报文的两个核心组成部分:请求报文和响应报文,揭示它们如何共同构建了网络通信的基础。......
  • 24-08-04 JavaSE java集合详解
    24-08-04JavaSE集合详解文章目录24-08-04JavaSE集合详解理解集合java集合的体系框架Collection类Collection接口的常用方法集合的遍历iterator迭代器增强for循环List类List类的常用方法List的三种遍历方法List的排序ArrayList类ArrayList类的注意事项Arraylist的......
  • 排序算法 归并排序 MergeSort -- C语言实现
    归并排序归并排序(Mergesort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(DivideandConquer)的一个非常典型的应用。作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法);自下......