操作符详解(上)

目录

操作符的分类

二进制和进制转换

2进制转10进制

10进制转2进制数字

2进制转8进制

2进制转16进制

原码、反码、补码 

移位操作符

左移操作符

右移操作符

位操作符:&、|、^、~

单目操作符

逗号表达式


操作符的分类

• 算术操作符: + 、- 、* 、/ 、%

• 移位操作符: >

• 位操作符: & | ^ `

• 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、>= 、&= 、|= 、^=

• 单目操作符: !、++、--、&、*、+、-、~ 、sizeof、(类型)

• 关系操作符: > 、>= 、< 、<= 、 == 、 !=

• 逻辑操作符: && 、||

• 条件操作符: ? : 

• 逗号表达式: ,

• 下标引用: [ ]

• 函数调用: ( )

• 结构成员访问: . 、->

上述的操作符,已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单目操作 符,今天继续介绍一部分,操作符中有一些操作符和二进制有关系,我们先铺垫一下二进制的和进制转换的知识。

前面部分操作符所属:

C语言数据类型和变量(上)-CSDN博客

C语言数据类型和变量(下)-CSDN博客

二进制和进制转换

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

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

15的2进制:1111

15的8进制:17

15的10进制:15

15的16进制:F

上面的看不懂关系,先讲一讲原理性的东西。 

我们重点介绍一下二进制: 首先我们还是得从10进制讲起,其实10进制是我们生活中经常使用的,我们已经形成了很多尝试:

• 10进制中满10进1。

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

类比一下,其实二进制也是一样的。

• 2进制中满2进1。

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

2进制转10进制

其实10进制的123表示的值是一百二十三,为什么是这个值呢?其实和10进制的每一位是权重有关的,10进制的数字从右向左是个位、十位、百位....,分别每一位的权重是 10^0 , 10^1 , 10^3 ……如下图:

2进制和10进制是类似的,只不过2进制的每一位的权重,从右向左是: 2^0 , 2^1 , 2^2 ... 

如果是2进制的1101,该怎么理解呢? 

总结:二进制(推广也可以)化为十进制使用该位的位数乘以该位的权重算出权重值,然后每一位的权重值相加最总的结果就是该二进制数对应的十进制。

10进制转2进制数字

当我们拿到一个十进制的125,要想转换成2进制该怎么办呢?我们只需要不断地除以2,保留每一次除以2,剩下的余数,直至最后商等于0,然后把保留的余数逆序输出就得到了125对应的2进制。如下图:

同理10进制转6进制,10进制转8进制,10进制转16进制都是如此。 

2进制转8进制

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进制转16进制

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表示“负”。 正整数的原、反、补码都相同。 负整数的三种表示方法各不相同。

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

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

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

举个例子:

对于整形来说:数据存放内存中其实存放的是补码。 (原因是在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。不知道也没关系,记住整形数据在内存中存放的是补码就可以了。)

顺便说一下计算机的一些常见的单位:bit(比特位),byte(字节),KB,MB,GB,TB,PB

 1个字节等于8个比特位。

后面那些相互之间都是1024进制转换。1 KB=1024 byte

 这是原码变成补码,那么补码变成原码怎么办呢?其实就只需要减一,再将反码的符号位不变,其他位依次按位取反(即0变成1,1变成0)就可以得到原码。其实还有一种方法,就是按照原码变补码的方法再走一遍。

同样就拿刚刚那个例子来说:

我们可以看到这个和刚刚那个是一样的。 

总结一下:原码得到反码可以使用:取反,+1的操作。

                  反码得到原码也可以使用:取反,+1的操作。

移位操作符

<< 左移操作符

>> 右移操作符

注:移位操作符的操作数只能是整数和 % 是一样的。

        移位操作符同样移动的是2进制位。

左移操作符

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

代码演示:

具体过程如下图:

右移操作符

移位规则:首先右移运算分两种: 1. 逻辑右移:左边用0填充,右边丢弃 。2. 算术右移:左边用原该值的符号位填充,右边丢弃。 

我们用图来分别描述逻辑右移和算术右移:

逻辑右移:

 算术右移:

接下来,就验证一下VS2022编译器用的是哪一种:

代码演示:

我们可以从结果得知:VS2022采用的是算术右移,其实这个也是比较合理的。那个直接补0,就有点无脑了。

注意:1. 右移到底是算数右移,还是逻辑右移这是取决于我们的编译器的,常见的编译器采用的都是算术右移。

2.对于移位运算符,不要移动负数位,这个是标准未定义的。 

3.聪明的小伙伴应该发现了,左移有乘以2的效果,右移有除以2的效果。 

位操作符:&、|、^、~

&   按位与  ——>二进制位同为1,则是1;否则,就是0。

|    按位或  ——>二进制位有1则为1;否则,就是0。

^   按位异或 ——>二进制位相同则为0,、;否则,就是1。

~   按位取反 ——>包括符号位在内,0变1,1变0。

注:他们的操作数必须是整数,它们是操作数也是2进制位

代码演示:

这个过程到底是怎么变化的呢?画图来分析一下:

注意:0的原码,反码,补码也是相同的 。

单目操作符

单目操作符有这些: !、++、--、&、*、+、-、~ 、sizeof、(类型)

单目操作符的特点是只有⼀个操作数,在前面那篇文章中(C语言数据类型和变量(下)-CSDN博客)单目操作符中只有&和*没有介绍,这2个操作符,在学习指针的时候在介绍。

逗号表达式

 常见形式:exp1, exp2, exp3, …expN

 逗号表达式,就是用逗号隔开的多个表达式。

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。 

注意:这里虽然最终的结果是最后一个表达式的结果,但是并不代表前面的表达式不要计算,前面的表达式可能会影响最终表达式运算的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/350660.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习之Flink,了解Flink的多种部署模式

目录 一、部署模式 1. 部署模式分类&#xff1a; 1.1 会话模式&#xff08;Session Mode&#xff09;&#xff1a; 优点&#xff1a; 缺点&#xff1a; 1.2 单作业模式&#xff08;Per-Job Mode&#xff09;&#xff1a; 优点&#xff1a; ​ 缺点&#xff1a; ​ 1.3…

Kubernetes/k8s之安全机制:

k8s当中的安全机制 核心是分布式集群管理工具&#xff0c;容器编排&#xff0c;安全机制核心是:API SERVER作为整个集群内部通信的中介&#xff0c;也是外部控制的入口&#xff0c;所有的安全机制都是围绕api server开设计的。 请求api资源 1、认证 2、鉴权 3、准入机制 三…

【技术预研】StarRocks官方文档浅析(2)

背景说明 基于starRocks官方文档&#xff0c;对其内容进行一定解析&#xff0c;方便大家理解和使用。 若无特殊标注&#xff0c;startRocks版本是3.2。 下面的章节和官方文档保持一致。 参考文档 产品简介 | StarRocks StarRocks StarRocks 是一款高性能分析型数据仓库&…

Conda python管理环境environments 四 从入门到精通

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通Conda python管理环境environments 三 从入门到精通…

CSS复合选择器和CSS层叠性、继承性有哪些内容?

知识引入 1.CSS复合选择器 书写CSS样式表时&#xff0c;可以使用CSS基础选择器选中目标元素。但是在实际网站开发中&#xff0c;一个网页中可能包含成千上万的元素&#xff0c;如果仅使用CSS基础选择器&#xff0c;是远远不够的。为此&#xff0c;CSS提供了几种复合选择器&am…

【论文笔记】Learning Deconvolution Network for Semantic Segmentation

重要说明&#xff1a;严格来说&#xff0c;论文所指的反卷积并不是真正的 deconvolution network 。 关于 deconvolution network 的详细介绍&#xff0c;请参考另一篇博客&#xff1a;什么是Deconvolutional Network&#xff1f; 一、参考资料 Learning Deconvolution Netwo…

命令行启动Android Studio模拟器

1、sdk路径查看&#xff08;打开Android Studio&#xff09; 以上前提是安装的Android Studio并添加了模拟器&#xff01;&#xff01;&#xff01; 2、复制路径在终端进入到 cd /Users/duxi/Library/Android/sdk目录&#xff08;命令行启动不用打开Android Studio就能运行模拟…

深入理解ZooKeeper分布式锁

第1章&#xff1a;引言 分布式系统&#xff0c;简单来说&#xff0c;就是由多台计算机通过网络相连&#xff0c;共同完成任务的系统。想象一下&#xff0c;咱们平时上网浏览网页、看视频&#xff0c;背后其实都是一大堆服务器在协同工作。这些服务器之间需要协调一致&#xff…

微信小程序元素/文字在横向和纵向实现居中对齐、两端对齐、左右对齐、上下对齐

元素对齐往往是新学者的一大困惑点&#xff0c;在此总结常用的各种元素和文字对齐方式以供参考&#xff1a; 初始显示 .wxml <view style"width: 100%;height: 500rpx; background-color: lightgray;"><view style"width: 200rpx;height:100rpx;bac…

navicat连接postgresql、人大金仓等数据库报错

navicat连接postgresql、人大金仓数据库报错问题是一个偶现的问题&#xff0c;需要我们特别关注&#xff1a; 1、客户端连接人大金仓数据库 这里注意&#xff1a;navicat连接postgresql、人大金仓数据库时均选择postgresql类型&#xff0c;因为人大金仓数据库底层和psql数据库…

Github 无法正常访问?一招解决

查询IP网址: https://ip.chinaz.com/ 主页如下&#xff1a; 分别查询以下三个网址的IP&#xff1a; github.com github.global.ssl.fastly.net assets-cdn.github.com 修改 hosts 文件&#xff1a; 将 /etc/hosts 复制到 home 下 sudo cp /etc/hosts ./ gedit hosts 在底下…

【大根堆】【C++算法】871 最低加油次数

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 大根堆 优先队列 LeetCode:871最低加油次数 汽车从起点出发驶向目的地&#xff0c;该目的地位于出发位置东面 target 英里处。 沿途有加油站&#xff0c;用数组 stations 表示。其中 statio…

洛谷P5735 【深基7.例1】距离函数(C语言)

首先&#xff0c;三角形周长为 其次(x1,x2)和 &#xff08;y1,y2&#xff09;的距离 然后就可以为所欲为 #include <stdio.h> #include <math.h>double distance(double a1, double b1, double a2, double b2) {return sqrt((a1 - a2) * (a1 - a2) (b1 - b2) * …

code server安装使用教程

1. 安装 1.1. 下载code-server安装包 类似这种文件&#xff1a;code-server-3.10.2-linux-amd64.tar.gz 解压&#xff1a;tar -xvf code-server-3.10.2-linux-amd64.tar.gz 1.2 &#xff08;可选&#xff09;建立软连接 ln -s path/to/code-server-3.10.2-linux-amd64/bin…

IS-IS:05 ISIS开销值和协议优先级

IS-IS 协议为路由器的每个 IS-IS 接口定义并维护了一个 level-1 开销值和一个 level-2开销值。开销值可以在接口上或者全局上手动配置&#xff0c;也可以使用 auto-cost自动计算确定。 修改接口cost&#xff1a; int g0/0/0 isis cost 50修改全局cost&#xff1a; isis cir…

四、Kotlin 表达式

1. 常量 & 变量 1.1 可读写变量&#xff08;var&#xff09; var x initValue // x 称为可读写变量注意&#xff1a;当 var 声明的变量做成员属性时&#xff0c;默认提供 setter/getter 方法。 1.2 只读变量&#xff08;val&#xff09; val x initValue // x 称为只…

鸿蒙开发第2篇__装饰器

在ArkTS中&#xff0c; 有装饰器语法。 装饰器用于装饰类、结构、方法、变量&#xff0c;赋予其特殊的含义。 1. Component 表示自定义组件&#xff0c; 用此装饰器的组件是可重用的&#xff0c;可以与其他组件重合 此装饰器装饰的 struct 表示该结构体具有组件化能力&#…

学习STM32,该用哪款开发工具?

有很多初学者在问&#xff1a;学习STM32&#xff0c;该用哪款开发工具&#xff1f; 我首先说一下我的观点&#xff1a; 1.没有最好&#xff0c;只有适不适合&#xff0c;适合自己的才是最好的。 2.开发工具很多&#xff0c;各有各的特点&#xff0c;有优点肯定也有缺点。 本文…

Google Chrome RCE漏洞 CVE-2020-6507 和 CVE-2024-0517 流程分析

本文深入研究了两个在 Google Chrome 的 V8 JavaScript 引擎中发现的漏洞&#xff0c;分别是 CVE-2020-6507 和 CVE-2024-0517。这两个漏洞都涉及 V8 引擎的堆损坏问题&#xff0c;允许远程代码执行。通过EXP HTML部分的内存操作、垃圾回收等流程方式实施利用攻击。 CVE-2020-…

8.6 代理设计模式

文章目录 一、代理模式&#xff08;Proxy Pattern&#xff09;概述二、代理模式和观察者设计模式三、模式结构四、协作角色五、实现策略六、相关模式七、示例八、应用 一、代理模式&#xff08;Proxy Pattern&#xff09;概述 代理模式是一种设计模式&#xff0c;它通过引入一个…