『C语言初阶』第八章 -隐式类型转换规则
前言
今天小羊又来给铁汁们分享关于C语言的隐式类型转换规则
,在C语言中类型转换方式可分为隐式类型转换
和显式类型转换
(强制类型转换),其中隐式类型转换是由编译器自动进行,无需程序员干预,今天小羊课堂说的就是关于隐式类型转换,隐式类型转换分为两种情况:整型提升和算术转换
。
一、隐式类型转换的规则
在c语言中,自动类型转换遵循以下规则:
- 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
- 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。
a、若两种类型的字节数不同,转换成字节数高的类型
b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型 - 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
- char型和short型参与运算时,必须先转换成int型。
- 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
二、整型提升
C的整型算术运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
原理
有符号补符号位,无符号位无脑补0
1.负数的整型提升
高位补充符号位,即补1
char a=-1;
变量a的二进制位(补码)中只有8个比特位:
11111111
因为char是有符号的char
所以整型提升的时候,补符号位,即补1
提升结果:
11111111 11111111 11111111 11111111
2.正数的整型提升
高位补充符号位,即补0
char a=1;
变量a的二进制位(补码)中只有8个比特位:
00000001
因为char是无符号的char
所以整型提升的时候,补符号位,即补0
提升结果:
00000000 00000000 00000000 00000001
3.无符号的整型提升
无符号整型提升,高位补0(无符号只有正数)
三、整型提升实例
例1:
#include <stdio.h>
int main()
{char a = 5, b = 127;char c = a + b;int d = a + b;printf("c=%d\n", c);printf("d= %d", d);return 0;
}
运行结果:
c=-124
d=132
分析:
char a=5
0000 0101 --> a=5
char b=127
0111 1111 --> b=127
因为参与了运算,并且char类型的精度小于int类型,所以这里进行整型提升:
00000000 00000000 00000000 00000101 --> a=5
00000000 00000000 00000000 01111111 --> b=127
00000000 00000000 00000000 10000100 --> c=132//1:>将结果存入类型为char的变量c中,c只能存储8位,所以保留结果最后8位
1000 0100 --> c=132
由于char类型也是有正负的,且计算结果是以补码形式,转化为原码
补码:1000 0100
反码:1000 0011
原码:1111 1100 --> -124
原码值为-124//2:>运算还是先整型提升再运算,二进制同上,最后结果存放到int类型的b中,所以直接就是132
例2:
#include<stdio.h>
int main()
{char a = 0xb6;short b = 0xb600;int c = 0xb6000000;if (a == 0xb6)printf("a");if (b == 0xb600)printf("b");if (c == 0xb6000000)printf("c");return 0;
}
运行结果:
c
分析:
a=0xb6
整型提升前:10110110
整型提升后:11111111 11111111 11111111 10110110 可以直接看出这是一个负数的补码
b=0xb600
整型提升前:10110110 00000000
整型提升后:11111111 11111111 10110110 00000000 可以直接看出这也是一个负数的补码
c=0xb6000000
无需整型提升,故结果为真
例3:
#include<stdio.h>
int main()
{char c = 1;printf("c=%u\n", sizeof(c));//%u按无符号整形unsigned int打印printf("c=%u\n", sizeof(+c));printf("c=%u\n", sizeof(-c));return 0;
}
运行结果:
c=1
c=4
c=4
分析:
sizeof(c),c没有参与运算,故就是求char类型大小
sizeof(+c),sizeof(-c),c参与运算,整型提升为int,故就是求int类型大小
四、算术转移
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另一个操作数的类型,否则操作就无法进行,下面的寻常算术转换。
//从高到低
long double
double
float
unsigned long int
long int
unsigned int
int
注:
如果在同一运算中操作数类型不同,等级低的要往等级高的转换。
算术转换要合理,否则会存在潜在的问题
例1:
float f=3.14;
int num=f;//隐式转换,精度丢失
例2:
#include<stdio.h>
int main()
{unsigned char a = 0;unsigned char b = 255;unsigned char c = 255;a = b + c;printf("a = %d\n", a);return 0;
}
运行结果:
a = 254
分析:
b和c的值都需要提升为整型,再执行加法运算b\c:>
整型提升前:11111111
整型提升后:11111111 11111111 11111111 1111111111111111 11111111 11111111 11111111 --> b11111111 11111111 11111111 11111111 --> c
111111111 11111111 11111111 11111110 --> a结果保留最后的8位11111110 --> 补码由于是无符号char类型,那么原反补一样原码也是11111110 即为254
总结
发生转换的原因:
硬件:CPU寄存器的比特位是统一的,将内存中的数据放入寄存器中就会发生隐式转换
软件:C语言的操作符对多个操作数进行操作时,必须保证其类型一致
五、操作符的属性
1.操作符
复杂表达式的求值有三个影响的因素。
操作符的优先级
。决定了有多个操作符和多个操作数时,先执行哪部分。操作符的结合性
。当优先级相同,多个或单个操作符之间从左向右执行还是从右向左执行。是否控制求值顺序
。特定的某些表达式在进行求值,根据不同的条件产出不同的求值过程。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
2.操作符优先级
操作符优先级,从上往下,重点的
操作符 | 结合性 | 是否控制求值顺序 |
---|---|---|
() | N/A | 否 |
, | L-R | 否 |
-> | L-R | 否 |
++ | L-R | 否 |
– | L-R | 否 |
++ | R-L | 否 |
– | R-L | 否 |
* | R-L | 否 |
3.问题表达式
表达式1
a*b + c*d + e*f
注释:代码1在计算的时候,由于乘法的优先级比+的优先级高,只能保证的乘法计算是比+早,但是优先级并不能决定第三个*比第一个+早执行。
所以表达式的计算机顺序就可能是:
a*b
c*d
a*b + c*d
e*f
a*b + c*d + e*f
或者:
a*b
c*d
e*f
a*b + c*d
a*b + c*d + e*f
表达式2
非法表达式1
int main()
{int i = 10;i = i-- - --i * (i = -3) * i++ + ++i;printf("i = %d\n", i);return 0;
}
非法表达式2
int fun()
{static int count = 1;return ++count; }
int main()
{int answer;answer = fun() - fun() * fun();printf( "%d\n", answer);//输出多少?return 0; }
这两个表达式,铁汁们要好好思考这为什么是非法的,不懂得可以私信小羊哦
总结:
我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式一定存在问题
好了,今天小羊分享的C语言的隐式类型转换规则就讲到这里了,欢迎大家评论区留言~~
相关文章:

『C语言初阶』第八章 -隐式类型转换规则
前言 今天小羊又来给铁汁们分享关于C语言的隐式类型转换规则,在C语言中类型转换方式可分为隐式类型转换和显式类型转换(强制类型转换),其中隐式类型转换是由编译器自动进行,无需程序员干预,今天小羊课堂说的就是关于隐式类型转换…...

Fortinet数据中心防火墙及服务ROI超300%!Forrester TEI研究发布
近日,专注网络与安全融合的全球网络安全领导者 Fortinet(NASDAQ:FTNT)联合全球知名分析机构Forrester发布总体经济影响独立分析报告,详细阐述了在企业数据中心部署 FortiGate 下一代防火墙(NGFW)…...

【vue】简洁优雅的火花线、趋势线
来由 在github发现个好看易用的vue趋势线组件,特此记录。 效果 趋势图生成后效果如上,线条为渐变色,可设置是否平滑。具体线条走势,根据数据动态生成。 使用 安装 npm i vuetrend -S 引入 import Vue from "vue"…...

【软件工程】数据流图/DFD概念符号/流程图分层/数据字典
【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 目录 【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 一、数据流图 ( DFD ) 简介 二、数据流图 ( DFD ) 概念符号 1、数据流 2、加工 ( 核心 ) 3、数据存储 4、外部实体 三、数据流图 ( DFD ) 分层 1、…...

时序预测 | MATLAB实现基于CNN卷积神经网络的时间序列预测-递归预测未来(多指标评价)
时序预测 | MATLAB实现基于CNN卷积神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN卷积神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 1.Matlab实现CNN卷积神经网络时间序列预测未…...

Python中的字符串与字符编码
Hello,这里是Token_w的博客,欢迎您的到来 今天文章讲解的是Python中的字符串与字符编码,其中有基础的理论知识讲解,也有实战中的应用讲解,希望对你有所帮助 整理不易,如对你有所帮助,希望能得到…...

图数据库_Neo4j学习cypher语言_使用CQL命令002_删除节点_删除属性_结果排序Order By---Neo4j图数据库工作笔记0006
然后我们再来看如何删除节点 可以看到首先 我们这里 比如我要删除张三 可以看到 match (n:student) where n.name = "张三" delete n 这样就是删除了student集合中,name是张三的节点 然后我们再来看 如何来删除关系 match (n:student)-[r]->(m:student) where…...

C语言学习笔记---数据的存储详解
C语言程序设计笔记---015 C语言数据的存储1、数据类型的意义1.1、unsigned与signed数据类型例程11.2、补码与原码相互转换例程2 2、大小端的介绍2.1、大小端的例程12.2、大小端的例程2 --- 判断当前编译器环境属于大端或小端 3、综合练习题探究数据的存储3.1、练习题13.2、练习…...
js中的常见事件(鼠标事件,键盘事件,表单事件......)
JavaScript中的事件(Event)是指在网页中发生的某些特定操作(例如单击、加载页面等),可以被JavaScript代码捕获和处理。常见的事件有: 鼠标事件:单击(click)、双击(dblclickÿ…...

学校如何公布录取情况?源代码公布了
作为一名负责公布学生录取情况的老师,对于录取查询公布工作我们可以按照以下流程来进行公布: 1. 录取结果准备:首先,你需要确保录取结果的准确性和完整性。与招生办公室或相关部门核对录取名单,确保没有遗漏或错误。如…...

JAVA基础知识(一)——Java语言描述、变量和运算符
TOC(Java语言描述、变量和运算符) 一、JAVA语言描述 1.1 java语言描述 JDK、JRE、jVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些? JDKJre java的开发工具(javac.exe java.exe javadoc.exe) jre jvmjava的核心类库 为什…...

时序预测 | MATLAB实现基于KNN K近邻的时间序列预测-递归预测未来(多指标评价)
时序预测 | MATLAB实现基于KNN K近邻的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于KNN K近邻的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 基于KNN K近邻的时间序列预测-递归预测未来(多指标评价) …...

冉冉升起的星火,再度升级迎来2.0时代!
文章目录 前言权威性评测结果 星火大模型多模态功能插件功能简历生成文档问答PPT生成 代码能力 福利 前言 前几天从技术群里看到大家都在谈论《人工智能大模型体验报告2.0》里边的内容,抱着好奇和学习的态度把报告看了一遍。看完之后瞬间被里边提到的科大讯飞的星火…...

centos7安装erlang及rabbitMQ
下载前注意事项: 第一:自己的系统版本,centos中uname -a指令可以查看,el8,el7,rabbitMQ的包不一样! 第二:根据rabbitMQ中erlang version找到想要下载rabbitMQ对应erlang版本&#x…...

项目介绍:《WeTalk》网页聊天室 — Spring Boot、MyBatis、MySQL和WebSocket的奇妙融合
目录 引言: 前言: 技术栈: 主要功能: 功能详解: 1. 用户注册与登录: 2. 添加好友 3. 实时聊天 4. 消息未读 5. 删除聊天记录 6. 删除好友 未来展望: 项目地址: 结语&am…...

(el-Table)操作(不使用 ts):Element-plus 中Table 表格组件:多选修改成支持单选及表格相关样式的调整
Ⅰ、Element-plus 提供的 Table 表格组件与想要目标情况的对比: 1、Element-plus 提供 Table 组件情况: 其一、Element-ui 自提供的 Table 代码情况为(示例的代码): // Element-plus 自提供的代码: // 此时是使用了 ts 语言环境…...

【JAVA】变量的作用域与生存周期
个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言变量的作用域变量的生命周期局部变量全局变量 前言 变量,我们学习过程中逃不掉的知识,无论在哪种语言中我们都需要学会去合理的运用它,今…...

中科亿海微FIFO使用
引言 FPGA(现场可编程门阵列)是一种可编程逻辑器件,具有灵活性和可重构性,广泛用于数字电路设计和嵌入式系统开发。在FPGA中,FIFO(First-In, First-Out)是一种常见的存储器结构,用于…...

使用maven打包时如何跳过test,有三种方式
方式一 针对spring项目: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>true</skipTests> </configuration> …...

005-Spring 扩展点 :PostProcess
目录 Spring 扩展点 :PostProcess介绍PostProcess大纲文字明细使用方法示例Autowired 功能实现Resource 功能实现 后记 Spring 扩展点 :PostProcess 介绍 Spring 核心做的事情其实很简单就是:控制反转和依赖注入 也就是把 Class 解析为 Bea…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...