【C语言】你不知道的隐式类型转换规则

这篇具有很好参考价值的文章主要介绍了【C语言】你不知道的隐式类型转换规则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 🎈个人主页:库库的里昂
  • 🎐CSDN新晋作者
  • 🎉欢迎 👍点赞✍评论⭐收藏
  • ✨系列专栏C语言初阶、代码小游戏
  • 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

【前言】

  • 本文接着C语言中的操作符(万字详解)讲解隐式类型转换规则,还有没学操作符的老铁可以回头看看。
  • 在 C 语言中,类型转换的方式一般可分为隐式类型转换显示类型转换(也称为强制类型转换)。
  • 其中隐式类型转换由编译器自动进行,不需要程序员干预。
  • 隐式类型转换通常有两种情况:整形提升算术转换

一、隐式类型转换的规则

在C语言中,自动类型转换遵循以下规则:

  1. 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
  2. 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。
    a、若两种类型的字节数不同,转换成字节数高的类型
    b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
  3. 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
  4. char型和short型参与运算时,必须先转换成int型。
  5. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。

二、整型提升

C的整型算术运算总是至少以缺省整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

1.整型提升的意义

表达式的整型运算要在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中。

2.如何进行整体提升?

整形提升是按照变量的数据类型的符号位来提升的

2.1正数的整形提升

高位补充符号位,即补0

char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char //VS中默认char为有符号char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001

2.2负数的整型提升

高位补充符号位,即补1

char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111

2.3无符号整型提升

高位补0

3.整型提升实例

代码示例1:

#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

结果分析:

实例1中的a,b要进行整形提升,但是c不需要整形提升
a,b整形提升之后,变成了负数,所以表达式 a0xb6 , b0xb600的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真.

代码示例2:

#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

实例2中的,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节。
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof© ,就是1个字节。

三、算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

//排名由高到低
long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

警告:
但是算术转换要合理,要不然会有一些潜在的问题。

代码示例:

#include<stdio.h>
int main()
{
	float f = 3.14;
    int num = f;//隐式转换,会有精度丢失
	printf("num=%d",num);
}

代码结果:

num=3

结果分析:

在赋值运算过程中,当两边的数据类型不一样时,右边的数据将强制转换为左边的数据,即float类型的b将强制转会为int类型,小数点后面的部分直接丢弃,导致精度下降。

【小结】

如果不了解整形,c偷偷将你的数据类型改变了你都不知道。
我想大家应该了解整形提升了吧,下次c再偷偷改我们的类型,我们虽然不能阻止,但是却可以知道了吧!

今天讲的隐式类型转换就到这里啦!🎉文章来源地址https://www.toymoban.com/news/detail-625400.html

到了这里,关于【C语言】你不知道的隐式类型转换规则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 的隐式转换导致诡异现象的案例一则

    正是因为 MySQL 对字符串进行隐式转换时会截断再转,而不是像 Oracle、SQL Server 这些数据库针对这种问题直接报错,所以才出现了这个诡异的问题。 作者:刘晨 网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Or

    2024年02月10日
    浏览(46)
  • 【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》 🌝 每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 一、隐式类型转换 (一)整型提升的意义 (二)如何进行整型提升呢? 二、算数转换 三、操作符的属性 (一)操作符优先级汇

    2024年02月16日
    浏览(45)
  • MySQL隐式类型转换

    当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。有些转换是隐式发生的。例如,MySQL会根据需要自动将字符串转换为数字,反之亦然。 如果一个或两个参数都为 NULL ,则比较结果为 NULL 。但是相等比较运算符 = 除外,对于 NULL=NULL ,结果为1,不需

    2023年04月23日
    浏览(48)
  • 默认成员函数:详解类的隐式操作

    类的默认成员函数就是定义一个类后,类会 自动生成的成员函数 ,若我们显示定义则类不会自动生成。 在数据结构学习阶段我们手撕过栈、链表、队列等数据结构,当时我们是用C语言来实现的,每一种数据结构都有自己的初始化和销毁函数。这两个函数对数据结构的使用非

    2024年02月02日
    浏览(35)
  • Scala隐式参数提示 找不到参数的隐式 报错ambiguous implicit values:

    这个问题纯属被一个博客给坑了,Scala的隐式查找是按照类型查找的,例如这里的x是Int,y是Int,那么编译器就不知道你要传入的是哪个,哪怕你把参数都x,y这些名称都对应也不行。 解决方法很简单,同类型的隐式参数唯一即可 不知道是另有原因还是什么,有些博主写博客真就

    2024年03月19日
    浏览(42)
  • JS隐式转换与类型比较

    隐式转换(Implicit Conversion)是指在表达式求值或操作中自动发生的类型转换。当使用不同的数据类型进行操作时,JavaScript 会自动进行类型转换以满足操作的要求。 隐式转换在编写逻辑时经常会出现,特别是在需要进行判断的逻辑场景中。举个例子: 需要注意的是,隐式转

    2024年02月07日
    浏览(33)
  • Selenium中的隐式等待和显式等待

    在Selenium中,“等待”在执行测试中起着重要作用。在本文中,您将学习Selenium中“隐式”和“显式”等待的各个方面。 在本文中,您将学习到 1. 为什么我们需要在selenium中等待? 2. 隐瞒等待 3. 明确等待 4. 流利的等待 为什么我们需要在Selenium中等待? 大多数Web应用程序都

    2024年02月07日
    浏览(45)
  • PocketMiner:基于深度学习发现蛋白的隐式口袋

    标题:Predicting locations of cryptic pockets from single protein structures using the PocketMiner graph neural network 期刊: Nature communictions 团队:华盛顿大学生物化学与分子生物物理系 DOI:https://doi.org/10.1038/s41467-023-36699-3 靶点的成药口袋是药物研发的起点,而除了在自然状态下显而易见的”显式

    2024年02月10日
    浏览(39)
  • 【c++】类和对象(六)深入了解隐式类型转换

    🔥个人主页 : Quitecoder 🔥 专栏 : c++笔记仓 朋友们大家好,本篇文章我们来到 初始化列表,隐式类型转换以及explicit的内容 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是

    2024年04月13日
    浏览(51)
  • Java核心知识点1-java和c++区别、隐式和显示类型转换

    java和c++区别 java通过虚拟机实现跨平台特性,但c++依赖于特定的平台。 java没有指针,它的引用可以理解为安全指针,而c++和c一样具有指针。 java支持自动垃圾回收,而c++需要手动回收。 java不支持多重继承,只能通过实现多个接口来达到相同目的,而c++支持多继承。  隐式(

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包