C语言—操作符详解(操作符、进制转换、原码反码补码、结构体)

1.操作符分类

  • 算术操作符:+ 、- 、 * 、 / 、%
  • 移位操作符:<<  >>                                   //移动的是二进制位
  • 位操作符:&  |  ^                                        //使用二进制位进行计算
  • 赋值操作符:=  +=  -=  *=  /=  %=  <<=  >>=  &=  |=  ^=
  • 单目操作符:!  ++  --  &  *  +  -  ~  sizeof  
  • 关系操作符:>  >=  <  <=  ==  !=
  • 逻辑操作符:&&  ||
  • 条件操作符:?  :
  • 逗号表达式:,
  • 下标引用:[]
  • 函数调用:()
  • 结构成员访问:.  、  ->

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

2.二进制和进制转换

其实我们经常能听到2进制、8进制、10进制、16进制 这样的讲法。

其实2进制、8进制、10进制、16进制是数值的不同表示形式而已。

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

15的2进制:1111

15的8进制:17

15的10进制:15

15的16进制:F

//16进制的数值之前写:0x            8进制的数值之前写:0

2.1 2进制转10进制

2.1.1 10进制转2进制

2.2 2进制转8进制和16进制

2.2.1 2进制转8进制

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

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

2.2.2 2进制转16进制

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

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

3.原码、反码、补码

整数的2进制表示方法有三种,即:原码、反码和补码。

有符号整数的三种表示方式均有符号位数值位两部分,2进制序列中,最高位的1位是被当做符号位,剩余的都是数值位。(无符号数,所有位都是数值位

符号位都是用0表示“正”,用1表示“负”。

正整数的的原、反、补码都相同。

负整数的三种表示方法各不相同。

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

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

补码:反码加一

(学会逆向思维。注:补码—>原码的另一个方法:补码取反再加一)

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

为什么?

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

4.移位操作符

 //移动的是二进制位(对补码进行操作

<<  左移操作符                //二进制整体左移,右边补0

>>  右移操作符                //逻辑右移:左边补0,。   算术右移:左边补符号位。(取决于编译器选择哪一种。但通常是算术右移)

注:移位操作符的操作数只能是整数,不要移动负数位,这个是标准未定义的

(左移一位有乘2的效果,右移一位有除2的效果)

5.位操作符

注:a ^ a = 0          0 ^ a = a

例题:不用第三个局部变量,交换两个整型的值。

主要算法过程:a = a ^ b ;

                         b = a ^ b ;

                         a = a ^ b ; 

例题:一个数的二进制表示中1的个数。

解法一:

解法二:

解法三:

例题:判断一个数是不是2的次方。

提示:if(n&(n-1)==0)

           {

            printf(“yes”);

           }

例题:将13的二进制序列的第5位修改为1,然后再改回0。

6.逗号表达式

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

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

举个例子:

7.下标访问[],函数调用()

 7.1 []下标引用操作符

操作数:一个数组名 + 一个索引值(下标)

7.2 函数调用操作符

8.结构成员访问操作符

8.1结构体

C语言已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学生,描述一本书,这时单一的内置类型是不行的。

描述一个学生需要名字、年龄、学号、身高、体重等;

描述一本书需要作者、出版社、定价等。C语言为了解决这个问题,增加了结构体这种自定义的数据类型,让程序员可以自己创造适合的类型。

 8.1.1 结构的声明

8.1.2 结构体变量的定义和初始化

8.2 结构体成员访问操作符

8.2.1 结构体成员的直接访问

8.2.2 结构体成员的间接访问

后续文章会说明

9. 操作符的属性:优先级、结合性

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

9.1 优先级

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

例题:3 + 4 * 5      结果是:23

优先级表格参考:https://zh.cppreference.com/w/c/language/operator_precedence

9.2 结合性

如果两个操作数的优先级相同,那么就看结合性。

例:5 * 6 / 2 ;

“  *  ”和“  /  ”的优先级相同,但他们丢是左结合,所以从左向右执行。

10.表达式求值

10.1 整型提升

C语言中整型算术运算总是至少以却省(默认)整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

整型提升的意义:

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。

因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

 如何进行整型提升呢?

1.有符号整数提升是按照变量的数据类型的符号位来提升的

2.无符号整数提升,高位补0。

 

10.2 算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换

1.long double

2.double

3.float

4.unsigned long int+

5.long int

6.unsigned int

7.int

从下到上转换。 

作者自述:本文主要针对C语言的一些初级概念,对此作一个简单介绍。本文制作不易,求求动动你们发财的小手点个赞和关注,这是对我创造最大的动力。后续我也会跟进内容,尽量一周至少一次,保证内容的质量。如果有想知道的内容或者有建议的地方,欢迎后台私信或者在本文留言哦。感谢各位的支持捏Thanks♪(・ω・)ノ。

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

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

相关文章

前端js面试题--从字符串中删除删除注释代码

问题&#xff1a;从字符串中删除删除注释代码 描述&#xff1a; solution(weex,rex # and react\nflutter\nnative ssss !hybrid app, [#, !]) 写一个solution函数清除后面参数数组里面的字符串 打印效果 代码1 思路&#xff1a; 将字符全凡是有去掉标志符号的全部添加\n…

Ubuntu20.4中复现Graspness

Ubuntu20.4中复现Graspness 文章目录 Ubuntu20.4中复现Graspness1.安装cuda和cudnn2.安装pytorch3.安装MinkowskiEngine4.编译graspnetAPI5. RuntimeError: "floor" "_vml_cpu" not implemented for IntRefernece &#x1f680;非常重要的环境配置&#x1…

pyqt 分组框控件QGroupBox

pyqt 分组框控件QGroupBox 分组框控件QGroupBox介绍效果代码 分组框控件QGroupBox介绍 QGroupBox提供了一个框架&#xff0c;用于将其他控件&#xff08;如按钮、滑块、标签等&#xff09;组合在一起。 QGroupBox 通常包含一个标题栏和一个内容区域。标题栏显示文本标签&#…

经典回溯算法之N皇后问题

问题描述&#xff1a; 有一个N*N的棋盘&#xff0c;需要将N个皇后放在棋盘上&#xff0c;保证棋盘的每一行每一列每一左斜列每一右斜列都最多只能有一个皇后。 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如…

关于模型参数融合的思考

模型参数融合通常指的是在训练过程中或训练完成后将不同模型的参数以某种方式结合起来&#xff0c;以期望得到更好的性能。这种融合可以在不同的层面上进行&#xff0c;例如在神经网络的不同层之间&#xff0c;或者是在完全不同的模型之间。模型参数融合的目的是结合不同模型的…

探索智慧生活:百度Comate引领人工智能助手新潮流

文章目录 百度Comate介绍1. 什么是百度Comate&#xff1f;主要特点 2. Comate的核心功能智能问答功能语音识别功能语音助手功能个性化服务 使用教程(以vscode为例)1. 下载和安装Comate2. 插件配置方式1&#xff1a;无License用户方式2&#xff1a;购买License用户 3. 常用操作快…

软件设计师

软件设计师 第一章 计算机系统基础原/反/补/移码例题&#xff1a; 浮点数例题 海明校验码例题 CISC和RISC*流水线例题 存储系统cache*主存编址计算例题&#xff1a; 可靠性例题 性能指标例题 第二章 操作系统进程例题 PV操作 信号量例题 前驱图例题 死锁计算例题 段页式存储例题…

阵痛中的乳业产业,何时才能成为下一个啤酒产业?

说起饮品&#xff0c;近年来中国啤酒业中各大品牌齐齐聚焦高端化的趋势绝对值得一提。然而&#xff0c;与之相反&#xff0c;国内乳业却是仍未进入高端化阶段&#xff0c;甚至陷入了周期底部中。 图源&#xff1a;中国圣牧财报 增收降利 牧企承受巨大的供需缺口压力 从产业链…

设计模式(2)创造型设计模式

创建型模式 创建型模式1.工厂模式1.1 抽象工厂模式&#xff08;Abstract factory&#xff09;1.2 工厂方法模式&#xff08;Factory Method&#xff09;1.3 简单工厂模式&#xff08;Simple Factory&#xff09; 2. 建造者模式&#xff08;Builder&#xff09;3. 原型模式&…

P8799 [蓝桥杯 2022 国 B] 齿轮

P8799 [蓝桥杯 2022 国 B] 齿轮 分析 最右边的齿轮的转速是最左边齿轮的q倍 最右边的齿轮的半径是最左边齿轮的q倍 题意即为&#xff1a;查询数组中是否存在两个数&#xff0c;其中一个是另一个的q倍 题目范围&#xff1a;查询次数q:2*10^5&#xff0c;数组范围2*10^5&…

2024付费进群系统,源码及搭建变现视频课程(教程+源码)

前三节讲解搭建支付对接&#xff0c;后两节讲解一些引流变现的方法&#xff0c;还有一种变现就是帮人搭建这样的平台&#xff0c;因为全网都没有一套完整的视频教怎么搭建的&#xff0c;有也只是文字教程&#xff0c;一般新人根本看不懂&#xff0c;我视频实操演示&#xff0c;…

学习经验分享【36】论文投稿写作(非理工科文章)

业务进一步扩展&#xff0c;可辅导非理工科偏文科性质的论文辅导&#xff0c;有需要评职称但没有时间精力研究的或者其他相关需求的朋友可咨询了解。 人工智能技术在各领域的发展和思考&#xff0c;类似这种主题的文章。

压缩和归档库-LZ4介绍

1.简介 LZ4是一种快速的压缩算法&#xff0c;提供压缩和解压缩的速度&#xff0c;而牺牲了压缩率。它被设计用于快速的数据压缩和解压缩&#xff0c;特别是用于数据存储和传输。LZ4通常用于需要高速数据处理的场景&#xff0c;如数据库、日志文件处理和实时数据传输。 LZ4的特…

进一步分析并彻底解决 Flink container exit 143 问题

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

腾讯游戏海外扩张,增持芬兰游戏开发商股份持股比例增至14.8%

易采游戏网5月8日消息&#xff0c;近日腾讯再次出手&#xff0c;大幅增持了芬兰知名游戏开发商Remedy Entertainment的股份&#xff0c;持股比例猛增至14.8%。这一举动引起了业界和投资者的广泛关注。 据了解&#xff0c;腾讯此次增持是在2024年4月24日完成的。根据芬兰法律规…

Linux网络-PXE高效批量网络装机(命令+截图详细版)

目录 一.部署PXE远程安装服务 1.PXE概述 1.1.PXE批量部署的优点 1.2.要搭建PXE网络体系的前提条件 2.搭建PXE远程安装服务器 2.1.修改相关网络配置&#xff08;仅主机模式&#xff09; 2.2.关闭防火墙&#xff08;老规矩&#xff09; 2.3.保证挂载上 2.4.准备好配置文…

<网络安全>《76 概念讲解<第十课 物联网常用协议-网络层协议>》

协议简称全称名称内容说明IPv4互联网通信协议第四版IPv4是互联网的核心IPv6互联网协议第6版TCPTransmission Control Protocol传输控制协议TCP旨在适应支持多网络应用的分层协议层次结构。连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务…

【Python】什么是皮尔森系数

我不完美的梦 你陪着我想 不完美的勇气 你说更勇敢 不完美的泪 你笑着擦干 不完美的歌 你都会唱 我不完美心事 你全放在心上 这不完美的我 你总当做宝贝 你给我的爱也许不完美 但却最美 &#x1f3b5; 周冬雨《不完美女孩》 皮尔森相关系数&#xff08;Pe…

FinalShell连接虚拟机Linux系统连接超时

报错信息 java.net.ConnectException: Connection timed out: connect 排除是网络问题后可以尝试一下这个方法。 解决方案: 打开虚拟机终端输入:ifconfig 会出现端口信息: 看ens33这里的端口是多少&#xff0c;改一下重新连接就ok。

springboot+vue实现登录注册,短信注册以及微信扫描登录

说明&#xff1a;微信扫描登录需要微信注册--要钱&#xff0c;感谢尚硅谷提供的免费接口&#xff1b;短信注册需要阿里云的注册很麻烦并且短信费&#xff0c;没有接口&#xff0c;所以不打算实现&#xff0c;不过能做出效果。 目录 一、建立数据库 二、后端idea实现接口 1.…