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

news2025/1/11 10:47:01

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♪(・ω・)ノ。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统运维:修改docker容器与宿主机之间的端口映射,解决端口占用问题

目录 一、问题 二、docker端口映射 &#xff08;一&#xff09;docker端口映射定义 1、相关概念&#xff1a; 2、默认情况下&#xff0c;Docker容器会有一个端口映射&#xff1a; 3、端口范围&#xff1a; &#xff08;二&#xff09;配置相关 1、指定端口映射 2、随机…

3D模型如何实现拖拽打开?---模大狮模型网

在当今数字化时代&#xff0c;3D技术的应用已经深入到各行各业&#xff0c;为用户带来了更加丰富、生动的体验。然而&#xff0c;对于一些用户来说&#xff0c;打开和查看3D模型可能会面临一些困难&#xff0c;特别是在无法拖拽打开时。本文将为您揭示解决这一问题的方法&#…

c4d云渲染怎么操作?怎么使用?一文带你了解

Cinema 4D (C4D) 不仅是众多设计师所青睐的卓越三维软件&#xff0c;其自带的高效渲染器以及对云渲染农场的支持&#xff0c;都极大地拓宽了创意和生产的边界。通过利用强大的云计算资源&#xff0c;C4D能够帮助用户轻松克服渲染速度缓慢的难题&#xff0c;从而实现更加流畅和高…

2024人文艺术、社会发展与教育国际会议(ICHASDE2024)

2024人文艺术、社会发展与教育国际会议(ICHASDE2024) 会议简介 2024年国际人文、艺术、社会发展与教育会议&#xff08;ICHASDE2024&#xff09;将在中国昆明举行。会议旨在为从事“人文、艺术、社会发展和教育”的专家、学者、工程师和技术人员提供一个平台&#xff0c;分享…

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

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

SAP-ABAP-ALV报表

1、功能介绍 什么是ALV报表 2、开发步骤 事物码: SE38创建报表程序SE93生成TCODESE43SE91消息号报表类型:简单报表、复杂报表、报表树 报表组成:查询界面(选择屏幕)、展示界面、功能按钮 基本流程: 重点:数据放在内表里,临时表,放在内存里。 3、开发实战 按标题…

通过命令行设置ipv4

使用管理员打开命令行窗口。管理员权限更高。 使用Netsh查看网络信息. 在更改IP地址和相关信息之前&#xff0c;需要先找到要更改的网络接口的名称&#xff0c;执行以下命令&#xff1a; netsh interface ipv4 show config运行后, WLAN就是待修改的网络的名称。 自动获取i…

如何通过wifi网络将串口数据发送到多个设备

摘要&#xff1a;当lora电台的速率无法满足高速传输时&#xff0c;可以考虑用“串口服务器”。本文介绍一下如何使用TP-LINK的TL-CPE300D实现一对多的数据发送。 当前也有使用lora电台的&#xff0c;但是lora电台支持的速率有限&#xff0c;可能最大支持到9600&#xff0c;甚至…

8.删除有序数组中的重复项 II

文章目录 题目简介题目解答解法一&#xff1a;双指针&#xff08;快慢指针&#xff09;代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 删除有序数组中的重复项 II 相关的讲解&#xff01;&#x1f600; 题目简介 题目解…

【高阶数据结构】并查集

并查集 并查集1、概念2、根据人找编号 / 根据编号找人&#xff08;简单介绍一下并查集&#xff09;&#xff08;1&#xff09;代码展示&#xff08;2&#xff09;调试结果&#xff08;3&#xff09;优化1&#xff1a;小的往大的合并&#xff08;4&#xff09;优化2&#xff1a;…

如何把逻辑地址转换为物理地址

​ 使用系统架构设计师真题说明&#xff08;2021年&#xff09;某计算机系统页面大小为 4K&#xff0c;进程 P1 的页面变换表如下图示&#xff0c;看 P1 要访问数据的逻辑地址为十六进制 1B1AH&#xff0c;那么该逻辑地址经过变换后&#xff0c;其对应的物理地址应为十六进制&…

基于一种改进小波阈值的微震信号降噪方法(MATLAB)

微震是指岩体由于在人为扰动或自然原因下受力变形&#xff0c;发生破裂过程中能量积聚而释放的弹性波或应力波。微震信号具有信噪比低、不稳定性、瞬时性和多样性等特点。因此&#xff0c;在任何损坏之前都会出现微小的裂缝&#xff0c;这种微小的裂缝是由岩层中应力和应变的变…

TB交易开拓者旗舰版自动交易的设置

本文针对TB交易开拓者旗舰版V6.0.7.0(期货程序化交易软件下载 - 交易开拓者),目前网上没有自动交易设置的完整教程&#xff0c;特写此篇。 1. 设置期货账户的自动登录和登出。点击菜单“文件/系统设置”&#xff0c;然后在“安全”tab做如下设置&#xff1a; 2 设置你的期货账…

MyBatis认识

一、定义 MyBatis是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java O…

Ci24R1 (SOP8)2.4GHz无线收发一体、双向系统的智能家居芯片

Ci24R1 &#xff08;SOP8&#xff09;工作范围在2.4GHzISM频段&#xff0c;专为低系统应用成本的无线场合设计&#xff0c;集成嵌入式ARQ基带协议引擎的无线收发器芯片。它的工作频率范围为2400MHz-2525MHz&#xff0c;共有126个1MHz带宽的信道。 Ci24R1 &#xff08;SOP8&…

深度学习Day-16:实现天气预测

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a;根据提供的数据集对RainTomorrow进行预测 一、 基础配置 语言环境&#xff1a;Python3.7编译器选择…

微服务核心01-Maven【项目管理工具】基础

一、Maven 简介 1.1 传统项目管理&#xff1a; 1.2 Maven 的作用 项目构建&#xff1a;提供标准的、跨平台的自动化项目构建方式。依赖管理&#xff1a;管理项目依赖的资源&#xff08;jar 包&#xff09;&#xff0c;避免资源间的版本冲突问题统一开发结构&#xff1a;提供标…

RGB-D分割相关调研

一、常见的RGB-D分割网络结构 单分支 RGB和Depth信息进行前期融合&#xff08;a&#xff09;&#xff0c;常规的编码-解码结构&#xff0c;对卷积核进行改进以适应RGB和Depth信息&#xff0c;不需要改变网络结构 双分支 不同的分支对RGB和Depth信息进行&#xff08;中期b或者后…

如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问

文章目录 前言1. 安装 Raspberry Pi OS2. 测试 web 站点3. 安装静态样例站点4. 将web站点发布到公网4.1 安装 Cpolar4.2 cpolar进行token认证4.3 生成cpolar随机域名网址4.4 生成cpolar二级子域名4.5 将参数保存到cpolar配置文件中4.6 测试修改后配置文件4.7 配置cpolar服务开机…

华为静态路由跨网段通信eNSP

拓扑图&#xff1a; 底层原理&#xff1a; 通信需要4个地址 源MAC 源IP 目标MAC 目标IP ARP地址解析协议 通过ip地址解析MAC 如果是相同的网段直接通过 arp直接发送广播 谁是192.168.1.2 我需要的MAC 1.2就会回应告诉 1.1他的MAC 1.1会封装4个地址 发送方的IP MAC 接受方IP和MA…