关于显式类型转换以及隐式类型转换
哈喽嗷,铁汁们,咱们又见面了。是我嗷,一个不正经楼主。
首先提出一点,关于这个小细节专栏,看了绝对没好处(滑稽)
咳咳,咱们言归正传。
目录
隐式类型转换
①算术运算中的隐式转换
规则一:字符和整数的整型提升
规则二:寻常算术转换
规则三:无符号与有符号类型转换
②赋值表达式中的隐式转换。
③函数调用中的隐式转换
④函数返回类型的隐式转换
显式类型转换
顺便说一句:天冷了
隐式类型转换
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("大于");elseprintf("小于");
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天
关于显式类型转换以及隐式类型转换相关推荐
- 33 个 JavaScript 核心概念系列(三): 显式 (名义) 与 隐式 (鸭子)类型转换
原文地址:落明的博客 一. 前言 说实话,JavaScript 的类型转换是个相当头疼的问题,无论是对于初学者还是有经验的老司机.它的难处并不在于概念多难理解,而是情况多且杂,看似相同的情况结果却又出 ...
- js类型转换(隐式类型转换显式类型转换)
我们需要了解任何计算都只能在相同的数据类型之间执行.如果我们强制JavaScript执行执行一些操作,例如在字符串中添加一个数字,在这种情况下,js编译器会默认将数字更改为字符串类型,然后将两者连接起 ...
- C++类型转换:隐式转换和显式转换
目录 隐式转换 为什么要进行隐式转换 C++隐式转换的原则 C++隐式转换发生条件 隐式转换的风险 禁止隐式转换 显式转换 dynamic_cast static_cast const_cast re ...
- 类型转换:隐式转化(算数转换,整型提升,混合提升,赋值转换),强制转换【C语言】
类型转换 隐式转化 算数转换 整型提升 混合提升 赋值转换 强制转换 编译器使用注意 小结 类型转换 隐式转化 不需要人为参与而产生的默认转称为隐式转化. 隐式转化,是计算机语言实现层面最难的,指针是 ...
- JS强制类型转换和隐式类型转换
一.隐式类型转换 隐式类型转换会自动根据运算符进行类型转换.隐式类型转换的情况主要有以下几种. 如果表达式中同时存在字符串类型和数字类型的操作数,而运算符使用加号+,此时 JavaScript 会自动 ...
- C#的显式接口和隐式接口
C#的显式接口和隐式接口 接口的实现分为:隐式实现和显式实现.如果类或者结构要实现的是单个接口,可以使用隐式实现,如果类或者结构继承了多个接口那么接口中相同名称成员就要显式实现.显示实现是通过使用接口 ...
- JavaScript高级day02-AM【函数的prototype、显式原型与隐式原型、原型链】
笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目 录 P15 15.尚硅谷_JS高级_函数的prototype 15:04 1. 函数 ...
- 三种等待方式:强制等待、显式等待、隐式等待
我们在使用selenium的时候,会遇到一种定位不到的情况,因为web页面有一个加载的过程 当页面元素未出现时,去定位肯定是定位不到的,所以我们需要用到了'等待',该如何使用等待呢,让我们一起来探讨一 ...
- 【selenium-python】显式等待和隐式等待的使用和区别
我的博客 网上教程挺多,看完还是没太理解,看了官方文档稍微理解了一些,在此记录. 部分观点为个人理解,请批判性阅读.如有错误,请指正,万分感谢. 参考: webdriver_waits When to ...
- Android显式意图和隐式意图
intent基本理解 我们都知道Android四大组件:Activity .Service.broadcast receiver 及 内容提供者. 其中,Activity .Service.broad ...
最新文章
- Android TextView
- nopi 的使用记录
- JavaScript的过去、现在和未来--过去
- 张正友摄像机标定的研究(MATLAB+OpenCV)
- SQL注入学习part07:(SQL注入语句总结)
- python网络编程基础知识_python网络编程基础
- 如何在Mac上使用终端阻止网站?
- vue 同步加载_如何在vue里实现同步阻塞请求,请求完成之前不加载页面或组件?...
- html遮罩层动画制作,《Flash遮罩层动画的制作》的教学反思
- 宾馆酒店客房管理系统java源码
- RNA-seq那些事儿
- 儿童摄影HTML实现
- 35行代码搞定事件研究法(下)
- 物联网常见概念总结(期末复习)
- 求助:程序员得了结膜炎+干眼症怎么办?
- 晶振原理详解及测试方法
- c语言飞机票实验报告格式,c语言航班信息查询系统实验报告
- 教你如何与领导打交道
- 连载 大学生求职七大昏招(六)说谎 5
- python tts 保存wav_C#文本转语音并保存wav和MP3文件