C语言的显式类型转换和隐式类型转换详细讲解

 目录

一、类型转换

1、显式类型转换

2、隐式类型转换

二、算术转换

三、总结


每个编译器都会对表达式做两件事情,一是判断表达式中操作符的优先级和结合性,二是判断表达式中的操作数类型是否一致,如果不一致则需要进行类型转换。第一点在我前面的文章中已经讲解过了,这篇就特意来讲解一下第二点类型转换和算术转换。看看编译器是如何进行操作的。

一、类型转换

首先我们先来学习C语言中的类型转换,为什么要进行类型转换呢?因为C的整型算术运算总是至少以缺省整型类型的精度来进行的。编译器为了实现这个精度,所以会将表达式中操作数小于整型数据类型字节大小的数据转换为普通整型再进行运算,这种方法称为整型提升。如果有时候我们知道表达式中的数据需要进行转换,那我们就可以显示转换,如果有时候我们没有对数据进行显示转换,那么编译器就会隐式的帮我们转换。

所以,类型转换分为两种:显式类型转换和隐式类型转换。

显式类型转换:我们自己使用强制类型转换操作符进行数据类型转换。

隐式类型转换:编译器默认的帮我们转换。

那我们现在再来了解一个概念,编译器为什么要提升精度呢?这个就要从计算机层面进行分析,这是我从网上搜到的资料。

表达式的整型运算要在CPU的相应运算器内执行,也就是在CPU内整型运算器(ALU)。

ALU的操作数的字节长度一般就是int的字节长度(4个字节),同时也是CPU的通用寄存器的长度。

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

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

,然后才能送入CPU去执行运算。

 了解这些之后,我们就分别来学习一下两种方式的类型转换。

1、显式类型转换

int main()
{//显式类型转换float a = 10.55f;float b = 13.14f;float c = (int)a + (int)b;printf("%f\n",c);return 0;
}

大家看代码执行的结果,为什么两个浮点数相加之后,并且我用浮点数打印结果,却结果是不对的,应该打印正确的结果为23.690000。这是因为我对数据类型进行了显式转换的处理。

起到作用的代码主要是这一行:float c = (int)a + (int)b;首先变量a和变量b是浮点型存储在内存中的,然后我从内存中取出这两个变量的时候,就对他们进行了处理。处理的方式就是(int)a,意思就是把a的值取出来强制转换为int的数据类型,(int)c也是同样的处理,这样操作之后 (int)a + (int)b的结果就为10+13=23。最后再把23赋值给变量c,变量c在用浮点数的形式存储在内存中。所以最后打印出来的是23.000000。

看完这段代码是不是对显式类型转换有了一定的了解。这里提一个小小的建议,在以后写代码的时候,如果你知道自己需要使用什么样的数据类型,就提前定义好数据类型,尽量少在表达式中使用显式类型转换。这样可能会给你的代码带来潜在的危害。C语言标准有这个操作,说明也有它的好处存在,所以大家根据需要决定使用。

2、隐式类型转换

隐式这词见名思意就知道是我们不显式的写类型转换,让编译器根据代码的实际情况,判断要不要进行数据转换。编译器隐式转换的主要方法就是整型提升。

编译器是如何进行整型提升的呢?整形提升是按照变量的数据类型的符号位来提升的。下面给大家画图演示一下。

不管是short类型还是char类型,在表达式中进行运算的时候编译器都会按照图片中的方法进行整型提升。以方便CPU进行计算。

我们再来看一个例子:

    char c = -1;printf("%d\n",sizeof(c));printf("%d\n", sizeof(+c));printf("%d\n", sizeof(-c));

为什么同样用sizeof操作符求变量c的字节大小的时候,结果会不一样呢?这就是因为编译器在运行代码的时候,进行表达运算的时候,表达式中的数据类型有小于int字节大小的数据都会被隐式的整型提升操作。sizeof(+c)、sizeof(-c)中的c都做了表达式运算,所以被整型提升了,最后sizeof求的是int类型的字节数。

总结:显式类型转换就是可以随便转换我们想要的数据类型。而这里的隐式转换只是在表达式中,操作数的数据类型有小于int类型的数据转换为int大小的数据,也就是整型提升。这种只是隐式转换的一种形式,还有另外一种形式。

二、算术转换

这里的算术转换其实就是上面所说的隐式转换的第二种形式。这里的算术转换的都是大于等于int类型的数据。算术转换就是在一个表达式中,有两个不同数据类型的操作数,那么编译器就会隐式的转换为一种数据类型,然后进行运算。那编译器是如何判断将两种不同的数据类型转换成一个呢?那请看下面。

long double
double
float
unsigned long int
long int
unsigned int
int

编译器在隐式转换类型的依据就是把精度低的数据类型转换成精度高的数据类型。上面图片就是各种数据类型的精度排行,从下往上就是代表精度从低到高。

    int a = 20;float b = 5.23f;int c = a + b;

上面的代码中,有两个不同的数据类型变量,在进行   int c = a + b; 表达式运算的时候,会有一个隐式转换的过程。因为int 类型比 float类型的精度低,所以编译器会先把变量a隐式转换为float类型的数据,然后再把两个float类型的a和b进行相加。

注意:虽然编译器会帮我们隐式转换数据类型,提高数据类型精度。但我们还是要合理使用它。比如下面的代码就会带来潜在的问题。

本来我们想要把变量f的值给变量num,但是这里会有一个隐式转换,会把float类型隐式转换为int类型,这样就会导致数据的精度丢失。所以我们要合理的使用它,这种潜在的问题在调试bug的时候不容易找出来。

三、总结

 这节主要讲了类型转换的操作,类型转换主要分为显式类型转换和隐式类型转换。隐式类型转换又分为整型提升和算术转换两个操作。整型提升的用途主要是在表达式中,有数据类型小于int类型大小的,编译器就会隐式的把小于int类型的数据转换为int类型的数据。算术转换的用途就是在表达式中,操作数的数据类型都是大于等于int 类型,并且数据类型不一致,这个时候编译器就会隐式算术转换。两种隐式转换都有一定的潜在问题,大家都要合理使用。

谢谢大家~~

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

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

相关文章

机器学习(五) -- 监督学习(2) -- k近邻

系列文章目录及链接 目录 前言 一、K近邻通俗理解及定义 二、原理理解及公式 1、距离度量 四、接口实现 1、鸢尾花数据集介绍 2、API 3、流程 3.1、获取数据 3.2、数据预处理 3.3、特征工程 3.4、knn模型训练 3.5、模型评估 3.6、结果预测 4、超参数搜索-网格搜…

相机模型浅析

相机模型 文章目录 相机模型四个坐标系针孔相机模型世界坐标系到相机坐标系相机坐标系到图像坐标系图像坐标到像素坐标 四个坐标系 ①世界坐标系:是客观三维世界的绝对坐标系,也称客观坐标系。因为数码相机安放在三维空间中,我们需要世界坐标…

Python3 replace()函数使用详解:字符串的艺术转换

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

JavaScript(1)神秘的编程技巧

大家都感兴趣的箭头函数 箭头函数在许多场景中都可以发挥作用,尤其适用于简化函数声明和提高代码的可读性。以下是箭头函数可以使用的一些常见方面: (1)回调函数: 箭头函数特别适合作为回调函数,例如在事…

RuntimeError: Library cublas64_12.dll is not found or cannot be loaded

运行guillaumekln/faster-whisper-large-v2模型进行语音识别的时候报错了 RuntimeError: Library cublas64_12.dll is not found or cannot be loaded 代码: from faster_whisper import WhisperModelmodel WhisperModel("H:\\model\\guillaumekln\\faster…

Linux系统安装内网穿透实现固定公网地址访问本地MinIO服务

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂&am…

MY-Java高级面试题

1. jdk1.7 到 jdk1.8 Map 发生了什么变化 ( 底层 )? 1.8 之后 hashMap 的数据结构发生了变化,从之前的单纯的数组 链表结构变成数组 链 表 红黑树。也就是说在 JVM 存储 hashMap 的 K-V 时仅仅通过 key 来决定每一个 entry 的存 储槽位&…

网络安全:重要性与应对措施

1. 网络安全的重要性 随着互联网的普及和信息技术的快速发展,网络安全问题已经变得日益突出。网络攻击者可以通过各种手段窃取个人信息、破坏系统、传播病毒等,给个人和社会带来巨大的损失。因此,网络安全已经成为信息化时代的重要问题之一。…

【MySQL】如何判断一个数据库是否出问题

在实际的应用中,其实大多数是主从结构。而采用主备,一般都需要一定的费用。 对于主备,如果主机故障,那么只需要直接将流量打到备机就可以,但是对于一主多从,还需要将从库连接到主库上。 对于切换的操作&a…

百度获评CCIA数据安全和个人信息保护社会责任评价“三星”示范单位

日前,由中国网络安全产业联盟(CCIA)数据安全工作委员会主办的“促进数据安全合规流通使用”专题研讨会(CCIA数安委年度会议)成功举办。与会介绍了数据安全和个人信息保护社会责任试点评价工作的开展情况,并…

LangChain-11 Code Writing FunctionCalling 大模型通过编写代码完成需求 大模型计算加法

背景简介 我们知道GPT模型对于内容的输出,是对下一个字符的预测,通过概率选出下一个文本。 而且我们也知道,训练样本是非常庞大的,对于GPT来说,也是有可能学习过1 1 2的。 当我们向GPT询问11 时,完全可以…

FME学习之旅---day21

我们付出一些成本,时间的或者其他,最终总能收获一些什么。 教程:AutoCAD 变换 相关的文章 为您的 DWG 赋予一些样式:使用 DWGStyler、模板文件、块等 FME数据检查器在显示行的方式上受到限制。它只能显示线条颜色,而…

电商行业网络安全不可小视,如何保障网商平台的稳定

随着互联网的全面普及,基于互联网的电子商务也应运而生,并在近年来获得了巨大的发展,成为一种全新的商务模式,被许多经济专家认为是新的经济增长点。 作为一种全新的商务模式,它有很大的发展前途,同时&…

基于Java+SpringBoot+vue3+uniapp口红销售/商城管理系统设计与实现

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

java错误记录

文章目录 javaslf4j中log不存在 maven编译出现Non-resolvable import POM: Failure to find类找不到jdk版本不对 java slf4j中log不存在 解决方法:再idea中安装lombok插件。 离线下载地址 https://github.com/mplushnikov/lombok-intellij-plugin/releases&#x…

【二分查找】Leetcode 点名

题目解析 LCR 173. 点名 算法讲解 1. 哈希表 class Solution { public:int takeAttendance(vector<int>& nums) {map<int, int> Hash;for(auto n : nums) Hash[n];for(int i 0; i < nums[nums.size() - 1]; i){if(Hash[i] 0)return i;}return nums.si…

实验模拟gfs 五大逻辑卷

目录 一 实验环境 二 4台服务端准备工作 1&#xff0c;66,77,88,99 四台机器加4块磁盘 2&#xff0c; scan 刷新磁盘供电接口 并查看 3&#xff0c;改主机名&#xff0c;方便后续操作 4&#xff0c;为加快访问速度 写hosts文件 做映射&#xff08;55客户机也写&…

Google Cookie意见征求底部弹窗

关于欧盟 Cookie 通知 根据2024年欧盟的《通用数据保护条例》以及其他相关法规&#xff0c;要求google cookie的使用必须征求用户的同意&#xff0c;才能进行收集用户数据信息&#xff0c;因此跨境独立站&#xff0c;如果做欧洲市场&#xff0c;就必须弹出cookie收集数据弹窗&a…

【MATLAB源码-第183期】基于matlab的图像处理GUI很全面包括滤波,灰度,边缘提取,RGB亮度调节,二值化等。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. RGB颜色亮度调整 1.1 RGB颜色模型 RGB颜色模型是一种加色模型&#xff0c;使用红色&#xff08;R&#xff09;、绿色&#xff08;G&#xff09;、蓝色&#xff08;B&#xff09;三种颜色的不同组合来表示各种颜色。每种…

第9章 文件和内容管理

思维导图 9.1 引言 文件和内容管理是指针对存储在关系型数据库之外的数据和信息的采集、存储、访问和使用过程的管理。它的重点在于保持文件和其他非结构化或半结构化信息的完整性&#xff0c;并使这些信息能够被访问。文件和非结构化内容也应是安全且高质量的。 确保文件和内容…