C语言【隐式类型转换】和【显式类型转换】的详解

在这里插入图片描述

本期介绍🍖
主要介绍:那些不被轻易发现的类型转换,隐式类型转换和显示类型转换👀。


文章目录

    • 一、前言🍖
    • 二、隐式类型转换🍖
      • 2.1 整形提升🍖
          • 2.1.1 例题1🍖
          • 2.1.2 例题2🍖
          • 2.1.3 例题3🍖
      • 2.2 算数转换🍖
    • 三、显式类型转换🍖


一、前言🍖

  C语言是一种强类型语言,当使用一种类型代替另外一种类型进行操作时或者存在两个不同类型的对象进行操作时,首先就得进行类型的转换然后再说其他。而类型转换的方式一般可分为隐式类型转换(也称:自动类型转换)和显示类型转换(也称:强制类型转换),两者有着本质上的区别。

  隐式类型转换是由编译器自动进行的,不需要人为的干预,而且我们也观察不到类型是如何进行转换的,所以被称为:“ 隐式 ”。而显式类型转换是由程序员明确指定的,所以才被称为:“ 强制类型转换 ”。


二、隐式类型转换🍖

  有些表达式的操作数在求值的过程中可能需要转换为其他的类型,而这种你不知晓的类型上的转换通常分为两种情况:整形提升运算转换

  在讲整形提升算数转换之前,还得再补充一个知识点:截断操作。何为截断操作呢?下面举个例子:char a = 3;。大家有没有想过字面常量3是如何存储到char变量a中去的呀?注意这里的字面常量3本质上是一个整数,而一个整数所占的内存空间是32个二进制位,所以这时的3在内存存放的补码如下图所示。但是你想啊,字符变量a只能存放1个字节(即:8个二进制位),怎么可能放得3呢。所以这个时候就要发生截断了,截断的规则挑低位的字节数,放置到需要截断存储的变量中去,如下图所示。
在这里插入图片描述


2.1 整形提升🍖

  C语言的整形算数运算总是至少以默认的整形类型(int型)的精度来进行,也就是说参与运算的操作数最小也不能小于4个字节的精度,如若精度小于4个字节该操作数就必须提升成整形的精度。所以为了获得这个精度,表达式中字符型(char)和短整型(short)操作数在使用之前就应该被转换为普通整形,这种转换被称为:整形提升

  那大家有没有想过为什么最小是以整形的精度来进行运算呢?其实表达式的整形运算是在CPU内的整形运算器(ALU)执行,而该运算器操作对象的字节长度一般就是int型的字节长度。因此CPU是无法实现直接对2个char类型的操作数的运算,而是通过先转换为CPU内整形操作数的标准长度然后再进行加法运算的。

  整形提升前提条件只有当表达式中出现长度可能小于int型的整形值时,才须要对该值进行整形提升转换为int或unsigned int型,然后再送入CPU去执行运算

  整形提升的规则对于有符号的整形变量来说,整型提升是在高位补变量的符号位;而对于无符号的整形变量来说,整形提升是直接高位补0来实现的


2.1.1 例题1🍖

在这里插入图片描述
  问上面这个程序最终打印结果为什么是-126,是怎么算出来的呢?下面我们来细致的分析一下,如下图所示。首先char型变量a和b中分别放入截断后的3和127,然后将a+b整形提升运算后的结果进行截断操作放入char型变量c中,最后printf打印%d整形值时对变量c中的值进行按符号位的整形提升,得出的结果当然是-126啦。

在这里插入图片描述


2.1.2 例题2🍖

在这里插入图片描述
  程序如上图所示,问为什么只有c是成功打印的,而a和b却是不行的呢?先拿char型变量a来说吧,首先我们知道a截断存储了十六进制数0xb6,内存补码为:10110110。但当执行到if语句的时候,a需要进行关系运算时需要进行有符号的整形提升,所以整型提升时应该在高位补符号位,结果为:11111111111111111111111110110110,与0xb6的二进制序列:00000000000000000000000010110110当然不一样呀,所以if(a == 0xb6)判断的结果自然为假并不会打印a了呀。同理于short类型的变量b也是如此并不会被打印,而int类型的变量c由于其并不用进行整形提升,所以判断结果为真打印了c。


2.1.3 例题3🍖

在这里插入图片描述
  很多人会觉得这道题的结果是两个1,但值得注意的是上面这个例子中sizeof(+a)计算的是+a这个表达式值的类型所占的内存空间的大小,而+a表达式的值是a进行整形提升后的结果,所以sizeof的结果为4个字节。


2.2 算数转换🍖

  我们刚刚讨论的是类型小于整形的情况,而算数转换是用来处理这些大于等于整形的情况。如果某个操作符的各个操作数属于不同的类型,那么计算是无法进行下去的,除非将这些操作数全都转化为同一类型。寻常算数转换的方向:int→unsigned int→long int→unsigned long int→float→double→long double。

  举个易错的例子:
在这里插入图片描述
  肯定有人会说打印结果必然是hehe,因为sizeof(i)的结果是4嘛,必然大于-1的。可真的是这样吗?
在这里插入图片描述
  为什么会这样呢? 这是因为在执行if(i < sizeof(i))判断的时候隐蔽的发生了算数转换,将i的类型从int型转换成了unsigned int型,我们知道int型-1的补码在unsigned int下是一个非常大的整数必然远大于sizeof(i)计算出来的4,所以打印结果为haha。那为什么i会发生算数转换呢? 这是因为sizeof()表达式的返回值的类型其实是unsigned int型的。


三、显式类型转换🍖

  显示类型转换又被称为强制类型转换,是由我们所决定该转换成什么样的类型,通常在转换时会存在存储精度的损失,所以在使用时需要谨慎。强制类型转换规则(强制转换的类型)表达式

举个列子:
在这里插入图片描述
  你会发现强制类型转换(char)a;其实就像之前的截断操作一样,取后面的低8位然后存储到char类型的b中去,然后在printf打印的时候再按位整形提升,结果自然为-46。


在这里插入图片描述

这份博客👍如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧👀。

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

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

相关文章

基本数据类型的转换 (基础完整篇)

基本数据类型间的转换包括 自动类型转换 和 强制类型转换 ,本文还讲了基本数据类型和String类型间的转换&#xff0c;这些是学习的重点&#xff0c;掌握这些之后还有其他想法或疑问&#xff0c;都可以自己尝试用代码验证结果&#xff0c;总之多实践比死记硬背更有用。&#x1f…

真正的GHOXPGHOST纯净版“觉山孤鹤GHOSTXP纯净版”五一奉献

真正的GHOXPGHOST纯净版“觉山孤鹤GHOSTXP纯净版”五一奉献 描述&#xff1a;一、光盘DOS下启动图 图片&#xff1a; 描述&#xff1a;二、安装效果图 图片&#xff1a; 描述&#xff1a;三、进入桌面 图片&#xff1a; 描述&#xff1a;四、光盘WIN下启动图 图片&#xff1a; …

木蚂蚁软件光盘 V2.0 2008元旦贺岁版

木蚂蚁软件光盘 V2.0 2008元旦贺岁版木蚂蚁软件光盘 V2.0 ★2008元旦贺岁★『木蚂蚁wuhanqi出品--->装机必备』 软件大小&#xff1a;719MB软件类别&#xff1a;国产软件/系统工具软件性质&#xff1a;木蚂蚁wuhanqi特别版 软件授权&#xff1a;免费版 软件语言&#xff1a…

数据结构--队列与循环队列

队列 队列是什么&#xff0c;先联想一下队&#xff0c;排队先来的人排前面先出&#xff0c;后来的人排后面后出&#xff1b;队列的性质也一样&#xff0c;先进队列的数据先出&#xff0c;后进队列的后出&#xff1b;就像图一的样子&#xff1a; 图1 如图1&#xff0c;1号元素是…

【Flutter】Flutter 使用 toggle_switch 实现切换按钮

【Flutter】Flutter 使用 toggle_switch 实现切换按钮 文章目录 一、前言二、安装和基本使用三、Toggle Switch 的基础示例四、Toggle Switch 的高级用法五、实际业务中的完整示例六、总结 一、前言 你好&#xff0c;我是小雨青年&#xff0c;今天我要为大家介绍一个非常实用的…

node.js安装好后测试报错解决

node.js的版本是18.X.X node.js安装好后&#xff0c;执行命令&#xff1a; npm install express -g 报错&#xff01;&#xff01;&#xff01; 解决办法&#xff1a; 看报错是由于权限不够&#xff0c; 所以打开cmd时&#xff0c;以管理员的方式打开 然后再执行命令就OK了…

dataframe更改数据的方法(超级简单易懂!!!)

&#xff1a;&#xff1a;&#xff1a;&#xff1a;插入数据 import pandas as pd import numpy as npdfpd.DataFrame(data[[zs,18,1],[ls,19,1],[ww,17,2]],index[stu0,stu1,stu2],columns[name,age,group]) df 更改单个数据的方法 取出数据后直接赋值&#xff08;一般用不到…

怎样把PDF转换成WORD简单有效

其实文件格式转换的方法大同小异。无非就是选择格式&#xff0c;添加文件&#xff0c;开始转换&#xff0c;但是就这简单的几步&#xff0c;操作不好也会造成转换失败&#xff0c;下面小编以最常见的pdf转换成word格式为例&#xff0c;给大家详细说说pdf转换成word需要注意的地…

如何將人臉變漂亮(一)

利用 mediapipe 進行處理 規劃 1.先把人臉辨識&#xff0c;然後取出框框 2.把框框內的人臉&#xff0c;進行美容 -高反差保留 (1)曝光度調整 (2)綠色與藍色&#xff0c;疊加 (3)YUCIHighPassSkinSmoothingMaskBoost -調整圖像亮度 -混合 3.把人臉的嘴巴&#xff0c;進行塗紅 4.…

pdf转word文档怎么转?看完这篇你就会了

随着数字化时代的到来&#xff0c;电子文档的使用越来越普遍。无论是在学校里撰写论文、在公司里编辑报告&#xff0c;还是在日常生活中收到合同或简历&#xff0c;我们都可能遇到需要将pdf文件转换为word格式的情况。这时&#xff0c;一款高效且易用的pdf转word软件便成为我们…

那种单眼皮小眼睛塌鼻梁厚嘴唇但还挺好看的女生

那种单眼皮小眼睛塌鼻梁厚嘴唇但还挺好看的女生 Data Dance Data Dance大数据采集分析软件&#xff0c;大数据技术经典算法 只有不符合大众审美的人&#xff0c;所以每个人都是美的&#xff01;你们通过这篇文章认识了照片上的我&#xff0c;但如果你们在现实生活中见到我&…

pdf如何转换成word格式最简单

当我们遇到难题的时候&#xff0c;应该积极地寻找方法去解决问题&#xff0c;特别是工作中&#xff0c;只有遇到问题解决问题才能更好的完成工作&#xff0c;拿文件转换问题来说&#xff0c;遇到难转换的文件格式&#xff0c;我们只要积极寻找解决方法还是可以轻松完成转换的。…

pdf怎么转换成word 文档?这几个小妙招别错过

pdf怎么转换成word 文档&#xff1f;想必大家都经常遇到这样的问题&#xff1a;在网上下载了一个 pdf 文件&#xff0c;但是突然需要对其中的文字进行编辑&#xff0c;但是 pdf 文件却不支持直接编辑&#xff0c;这时就需要将 pdf 文件转换成 word 文档&#xff0c;进行编辑。下…

pdf转word文档怎么转?手把手教你转换

随着数字化时代的到来&#xff0c;电子文档在我们的生活和工作中扮演着越来越重要的角色。尤其是pdf格式的文件&#xff0c;由于其可靠性和跨平台的特性&#xff0c;成为了广泛使用的标准文档格式之一。然而&#xff0c;当我们需要对pdf文件进行编辑时&#xff0c;尤其是将其转…

Pandas Dataframe Drop函数的用法

Pandas Dataframe Drop函数的用法 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html

怎么把照片变年轻?这两个照片变年轻小妙招教给你

怎么把照片变年轻呢&#xff1f;随着年龄的增长&#xff0c;许多人会感到自己不再年轻&#xff0c;失去了曾经的美貌和活力。通过将照片变年轻&#xff0c;你可以重新体验过去的感觉&#xff0c;回忆起年轻时的美好时光&#xff0c;仿佛回到了过去&#xff0c;让我们感受到那段…

单眼皮眼妆学起来 打造电眼只需六步

很多内双或者单眼皮的MM们都很不自信&#xff0c;觉得自己的眼睛长得不够好看,对于单眼皮怎么画眼线一无所知&#xff0c;所以就不愿意化妆&#xff0c;而且就算化妆也得贴个双眼皮贴&#xff0c;看起来很不自然。其实不一定&#xff0c;现在国际上都爱单眼皮呢!今天&#xff0…

单眼皮比双眼皮高等?

郑昀 20091012 看到一条 玩聚RT 上榜消息&#xff1a;“ RT lookon RT Klaith: 交大医学院的某主任教授曾经和我们吹牛&#xff0c;说单眼皮的人比双眼皮的高等&#xff0c;因为除人以外的动物都只有双眼皮。22次锐推 | 最早发布于2009-10-11 ”。 果真如此&#xff1f; 1、狗…

Docker网络-探索容器网络如何相互通信

当今世界&#xff0c;企业热衷于容器化&#xff0c;这需要强大的网络技能来正确配置容器架构&#xff0c;因此引入了 Docker Networking 的概念。Docker 是一种容器化平台&#xff0c;允许您在独立、轻量级的容器中运行应用程序和服务。Docker 提供了一套强大的网络功能&#x…

Redis 10 大数据类型

1. which 10 1. redis字符串 2. redis 列表 3. redis哈希表 4. redis集合 5. redis有序集合 6. redis地理空间 7. redis基数统计 8. redis位图 9. redis位域 10. redis流 2. 获取redis常见操作指令 官网英文&#xff1a;https://redis.io/commands 官网中文&#xff1a;https:/…