C语言——隐式转换

本文介绍了C语言中的隐式转换,主要分为整型提升和算数转换。整型提升是将字符和短整型操作数转换为默认整型精度的过程,以适应CPU的整型运算。文章通过示例解释了整型提升如何导致数值的变化,并讨论了算数转换的规则,涉及数据类型的转换顺序。此外,还通过一个代码示例展示了隐式转换如何影响程序的逻辑和输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

隐式转换

1.整型提升

2.算数转换


前言

这里小编给大家简单的补充一下,一些有关C语言的知识点


隐式转换

由于转换形式的不同类型转换这里一共分为整型提升和运算转换两种形式

1.整型提升

在了解整型提升之前,这里我们需要先了解一下截断这个概念,对于截断操作,这里我举个例子给大家简单的说明一下

这里我们举一个例子,这里char a=1,但是对于char存储的大小仅仅只是8字节,那么对于常量1,这里却是一个整型,占了32字节,那么为了存储这个变量我们这里就会发生截断操作,对于截断的规则如下:从低位开始,选取处该需要存储的字节大小。

也即是:

 所以存储在变量a中也就是0 0  0 0  0 0 0 1。

那么整型提升又是什么呢?

C的整型算术总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中字符和短整型操作数在使用之前被转化为普通整型,这种转化就叫做整型提升。

整型提升的意义:
1.表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
2.通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。

那么对于整型提升的具体过程又是怎么的呢?

这里我们以char类型给大家简单演示一下:

大家可能平时会见到这样的代码:

int main()
{
	char a = 127;
	char b = 3;
	char c = a + b;
	printf("%d", c);
	return 0;
}

这里我们先直接看结果:

 大家都知道有符号得char类型得表示范围是-127~128,那么这里就不会出现存储130值的char类型,那么该又是怎么得到-126这个值的呢?

这里其实就发生了整型提升和截断的两个过程

首先我们进行运算就需要进行整型提升:

127的补码如下: 

 01111111

进行整型升后得到的是

00000000000000000000000001111111

3的补码是

00000011

整型提升后的值是:

00000000000000000000000000000011

然后我们把整型提升后的值进行相加得到:

00000000000000000000000010000010.

然后我们需要将其存入c,因为c是char类型,所以这里我们要对其进行截断操作,那么我们得到c的补码是:10000010。

然后我们对其进行打印操作,由于我们是将其按整型的形式打印出来,所以这里我们要进行整型提升,也就得到:11111111111111111111111110000010.

由于该是负数,这里我们就需要将其转化为原码输出,所以这里我们转换成原码后得到

10000000000000000000000001111110.

所以这里按二进制转十进制后,得到的值是:-126.

2.算数转换

对于小于整型的情况我们使用的是整型提升的方式,但是对于大于int的类型,我们采用的是算数转换的方式。那么对于算数转换的规则是:
int->unsigned int->long int->unsigned long int->float->double->long double

这里给大家简单举一个例子,这里我们使用到sizeof函数,这里有一点我们需要注意的是sizeof的返回值是unsigned int,那么下面我们直接看代码

int main()
{
	int i = -1;
	if (i < sizeof(i))
	{
		printf("haha");
	}
	else
	{
		printf("hehe");
	}
}

这里如果没有隐式转换,那么我们得到的值应该是haha,但是由于我们 i变量发生了隐式转换,遂于-1的无符号数,该是特别大的,所以我们这里的打印值应该是呵呵。

这里我们看运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半只牛马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值