关于显式类型转换以及隐式类型转换

哈喽嗷,铁汁们,咱们又见面了。是我嗷,一个不正经楼主。

        首先提出一点,关于这个小细节专栏,看了绝对没好处(滑稽)

 咳咳,咱们言归正传。

目录

隐式类型转换

①算术运算中的隐式转换 

规则一:字符和整数的整型提升

规则二:寻常算术转换

规则三:无符号与有符号类型转换

②赋值表达式中的隐式转换。

③函数调用中的隐式转换

④函数返回类型的隐式转换

显式类型转换

顺便说一句:天冷了


隐式类型转换

c语言中存在以下4种隐式类型转换: 

①算术运算中,低类型将转换为高类型。

②赋值表达式中,右边表达式的值将隐式转换为左边变量的类型,并赋值给他。

③函数调用中,在参数传递时,实参将隐式转换为形参的类型,并赋给形参。

④函数有返回类型时,系统隐式地将返回的表达式类型转换为函数的返回值类型。

值得一提的是,以上4中隐式类型转换在我们咔咔敲代码时,或多或少出现过。其实他日常带给我们的影响并不大,但并不妨碍一个对知识乐于吸收的人去了解他。比如你,是吧,铁汁。

①算术运算中的隐式转换 

算术运算中:许多运算符(单目/双目)会使得数据类型发生转换。

哦,铁汁,不知道你有没有遇到过这样一个代码:

	int a=10;
	int b=3;
	printf("%lf\n",a/b);
	printf("%lf\n",1.0*a/b);

他的结果是这样的:

为啥要乘以1.0来使得结果为浮点型数据呢?铁汁,你马上就要获得答案嗷 

对于算术运算中,有以下的类型转换规则

规则一:字符和整数的整型提升

对于char,short int或int型位段,包括他们的有无符号变形,以及枚举类型(下面称这些类型为源类型)。在计算表达式时,如果int可以完整表示源类型的所有值,那么源类型就转化为int类型。否则转化为unsigned int类型。

铁汁,熟不熟啊,这玩意就是个整型提升嗷。

整型提升简单表示为:在算术运算中,一些运算符使得源类型发生类型转换,一般情况转换为int进行表达式计算,如果int不够表示,就转化为unsigned int。

	char a=1;
	char b=2;
	printf("%d\n",sizeof(a+b));
	printf("%d\n",sizeof(+a));
	printf("%d\n",sizeof(-a));
	printf("%d\n",sizeof(~a));
	printf("%d\n",sizeof(!a));

 结果为:

 

再提一下:

算术运算中:许多运算符会使得数据类型发生转换。

 可以看到,char类型的数据在以上5个算术运算中,4个被整型提升为int型进行计算。+ - ~运算符使得char类型转换为int型进行计算。

而对于  !a  逻辑反操作符并没有使得类型发生转换。

这里只是简单介绍整型提升。关于具体的实现过程,可以看楼主写的另一篇文章:《整型提升之重生归来》。啊哈。

总结:算术运算中,一些单目双目操作符会使得源类型发生整型提升进行计算。

规则二:寻常算术转换

现在,不同于整型提升。

算术运算中:许多运算符(双目)会使得数据类型发生转换。

具体如下转换方式如下:

在双目运算符下:

当两个操作数类型等级不同时,将低级类型转化为高级类型。并将表达式计算结果也转换为高级类型。

有铁汁看到这啪的一下就站起来了,很快嗷。说:

 别急嗷,铁汁

数据类型存在“低级高级”,具体怎么样,看下面这张图,给你拿捏了嗷

(float与double等级属于很高的一层。但double仍然高于float)

回到先前那段代码。

 我们看:

 这里提一下:当我们写出小数时,系统默认为double类型。

看图知double类型相比较高级与int类型。

所以上面的计算过程为:

1:将a转化为double类型与1.0进行计算。结果为double类型。

2:将上面计算的结果double类型与b int类型比较,将b转化为double类型计算。结果为double类型。

所以计算结果为double类型。这也就解释了一开始为啥需要乘以1.0。

目的是使得计算时,存在double类型数据,将结果也转化为double类型数据。

铁汁们,现在是不是就拿捏了。

	int a=10;
	int b=3;
	printf("%lf\n",a/b);
	printf("%lf\n",1.0*a/b);

 

规则三:无符号与有符号类型转换

这个轻松拿捏嗷铁汁们。

在运算时:当两个数据类型仅仅为有无符号区别时,将有符号类型转化为无符号类型。

看一段代码轻松拿捏。

    int a = -1;
	unsigned int b = 1;
	if (a > b)
		printf("大于");
	else
		printf("小于");

 a与b进行比较运算时,将a转化为无符号数据类型。

a补码:11111111 11111111 11111111 11111111

转化为无符号数据类型,现在a表示数字不再是-1,而是以11111111 11111111 11111111 11111111

为原码对应的数字:

 可以看到为:4294967295。所以当然是大于1嗷。

铁汁们嗷,了解规则后我们还需要知道运算顺序。

运算顺序:

分三步走嗷铁汁们。

第一步:执行规则一,将源类型转换为int或者unsigned int。

第二步:float类型全部转换为double类型以提高精度运算。(小数系统默认为double类型)

第三步:按照运算符优先性计算表达式,并执行规则二与规则三。

铁汁们咱们看到题巩固一下:

计算:x = 100 + 'a' + 1.5 * u + f / 'b' - s * 3.1415926
    其中,u为unsigned型,f为float型,s为short型,x为float型。式中右面表达式按如下步骤处理:
    

第一步:'a'   'b'   s转换为int类型。

第二步:f转换为double类型。(1.5以及3.1415926默认为double类型)

第三步:按照运算符优先性:

                先计算(1.5*u),1.5为double类型,u为unsigned类型。执行规则二,将u转换为double类型,计算得结果double类型(1.5*u)

                接着计算(f/'b'),现在f为double类型,b为int类型,将b转换为double类型,计算得结果double类型(f/98.000000)

                接着计算(s*3.1415926),现在s为int类型。3.1415926为double类型。将s转化为double类型,计算得到结果为double类型(s*3.1415926)

                接着计算100+'a'+(double类型)(1.5*u)+(double类型)(f/98.000000)+(double类型)(s*3.1415926)

                接着计算(100+'a'),100和'a'为int类型,计算得结果为int类型(197)。

                最后计算197+(double类型)(1.5*u)+(double类型)(f/98.000000)+(double类型)(s*3.1415926),将197转换为double类型,计算。

                将计算的结果double类型转化为float类型赋值给x。

铁汁们,算术运算中的隐式转换到这就拿捏了嗷,咱们接着往下走。

②赋值表达式中的隐式转换。

当变量与等号右边表达式类型不同时,将右边表达式的类型转换为左边变量的类型。

这个好理解嗷铁汁们。

直接看代码:

int a=3.16;

 可以看到编译器将右边double类型的变量转换为int类型存储在a中。

③函数调用中的隐式转换

函数调用时,当实参与形参的类型不同时,实参将转换为形参的变量类型。并赋给形参。

直接看代码:

#include<stdio.h>

int add(int x, int y)
{
	return x + y;

}
int main()
{

	double a = 3.3;
	double b = 6.6;
	printf("%d", add(a, b));



	return 0;
}

我们启动调试,进入函数add内部查看形参接收到的值。

 铁汁们,可以看到,实参double类型的被转化为int类型并赋给了形参x与y。

④函数返回类型的隐式转换

当函数返回类型与返回值的类型不同时,将返回值的类型转换为函数返回类型。

直接看代码:

#include<stdio.h>

int add()
{
	return 3.16;
}
int main()
{
	printf("%d", add());
	return 0;
}

 可以看到,函数将返回值double类型的3.16转换为int类型的3。

写到这,c语言中隐式类型转换写完了。

楼主真的想裂开了。3000多个字呀,楼主坐在电脑旁腰都要断了。

当然,我不能抛下铁汁们,咱们还有显式类型转换。准备再写个一两千字仔细介绍一下显式类型转换。当然我想了想,可以稍微用稍微精炼一点的语言说一下显式类型转换。



显式类型转换

强制类型转换

关于显式类型转换的文章写完了嗷铁汁们。

我知道有铁汁啪的一下就站起来了,很快嗷

没办法嗷铁汁,这个显示类型转换在c语言中就是强制类型转换嗷铁汁。

嘿嘿。 

顺便说一句:天冷了

 天冷了嗷铁汁们,记得多穿点衣服。


                                                                                                                       记编程的第40天

                                                                                                                       来自CSDN的第25天                                               

 

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值