电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
嵌入式中的C语言类型转换居然有这么多奇妙技巧?
分 享
扫描二维码分享
嵌入式中的C语言类型转换居然有这么多奇妙技巧?
嵌入式
C语言
类型转换
李肖遥
关注
发布时间: 2020-07-23
丨
阅读: 478
在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮点类型。那么相互之间是怎么转化的呢? ## 了解一下类型转换 不同数据类型的存储大小和值范围是不一样的,程序在初始化的时候就已经设定了,例如: ``` int a = 9; float b = 8.5; ``` a,b占的字节大小不一样,这个我们应该都知道,在C语言中一个表达式允许不同类型的数据进行运算,例如: ``` int a = 9; float b = 8.5,c; c = a + b; ``` 但是计算机硬件在进行算术操作时,要求各操作数的类型具有相同的存储位数以及一样的存储方式,所以就出现了类型转换。 对于某些类型的转换,编译器可以隐式地自动进行,这种转换称为**自动类型转换**; 而有些类型转换需要程序员显式指明,那么通常把这种转换称为**强制类型转换**。 ## 自动类型转换 自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。 ### 我们先来看一段错误代码 ``` //https://tool.lu/coderunner/ //来源:技术让梦想更伟大 //作者:李肖遥 #include
int main() { //定义一个整型指针变量pPoint int* pPoint; //定义基本的数据的类型 char c; short s; int i; long l; float f; double d; //将整型浮点型数据赋值给指针类型 pPoint = c; pPoint = s; pPoint = i; pPoint = l; pPoint = f; pPoint = d; return 0; } ``` 由于指针变量和整型、浮点这些数据型的类型是不能相互赋值的,编译报错输出: ![image](https://static01.imgkr.com/temp/f9847c2d4f364d3ebee2e4f3907671f9.png) ### 那么我们把同类型数据类型进行运算后赋值呢? ``` //https://tool.lu/coderunner/ //来源:技术让梦想更伟大 //作者:李肖遥 #include
int main() { //定义一个整型指针变量pPoint int* pPoint; //定义基本的数据的类型 char c; short s; int i; long l; float f; double d; //将整型浮点型数据运算之后赋值给指针类型 pPoint = c + c; pPoint = s + s; pPoint = i + i; pPoint = l + l; pPoint = f + f; pPoint = d + d; return 0; } ``` - c + c->char同类型运算,结果是一个int类型。 - s + s->short同类型运算,结果是一个int类型。 - i + i->int同类型运算,结果是一个int类型。 - l + l->long同类型运算,结果是一个long类型。 - f + f->float同类型运算,结果是一个float类型。 - d + d->double同类型运算,结果是一个double类型。 ![](https://static01.imgkr.com/temp/e787cc3f116e4dc79771e83c85fac687.png) **同类型运算中:** - 整型:比int小的,都会转换成int,比int大的不变。 - 浮点:不变。 ### 那么我们把不同类型数据类型进行运算后赋值呢? ``` //https://tool.lu/coderunner/ //来源:技术让梦想更伟大 //作者:李肖遥 #include
int main() { //定义一个整型指针变量pPoint int* pPoint; //定义基本的数据的类型 char c; short s; int i; long l; float f; double d; //将整型浮点型数据混合运算赋值给指针类型 pPoint = c + s; // char + short = int pPoint = c + i; // char + int = int pPoint = c + l; // char + long = int pPoint = c + f; // char + float = long pPoint = c + d; // char + double = float return 0; } ``` - c + s->char类型与short类型运算,结果是一个int类型。 - c + n->char类型与int类型运算,结果是一个int类型。 - c + l->char类型与long类型运算,结果是一个long类型。 - c + f->char类型与float类型运算,结果是一个float类型。 - c + d->char类型与double类型运算,结果是一个double类型。 ![](https://static01.imgkr.com/temp/64fba5112cc646c5bfef9e926294d4ea.png) **不同类型运算中:** - 如果两边均比int小或等于int,那么结果为int。 - 如果两边有比int大的,那么结果为比int大的类型。 ### 我们得到如图所示规律 ![](https://static01.imgkr.com/temp/68e1f2a8f934452285ef270ee71ed7d2.png) - 整型类型级别从低到高依次为: int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long - 浮点型级别从低到高依次为: float -> double ### 自动转换规则 - 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 - 纵向箭头表示当运算符两边的运算数为不同类型时的转换,需要按照箭头方向转换。 - 当较低类型的数据转换为较高类型时,并不影响数据的实质内容。 - 当较高类型的数据转换为较低类型时则,可能有些数据丢失,即去掉小数部分。 ## 强制类型转换 强制类型转换是通过类型转换运算来实现的。其一般形式为: ``` (类型说明符) (表达式) ``` 其作用就是把表达式的运算结果强制转换成类型说明符所表示的类型的值。 ``` //https://tool.lu/coderunner/ //来源:技术让梦想更伟大 //作者:李肖遥 #include
#include
int main() { float f,x=1.3,y=1.4; int i = 4,a,b; a = x + y; b = (int)(x+y); f = 10/i; printf("a=%d,b=%d,f=%f,x=%f,y=%f\n",a,b,f,x,y); } ``` **运行结果如下:** ![](https://static01.imgkr.com/temp/604cccca82a44bbd8985fefcb453e974.png) 我们从中可以看到,虽然x,y变强制转换int型,但是最后输出的值不变,强制类型转换没有影响x和y变量原本的类型。 **得到结论:** 在C语言中,对一个变量赋值的时候,这个变量初始定义的类型包含了两层含义 1. 这个数据类型表示的内存空间的大小。 2. 编译器把设定的数值放到这个内存空间,是数据类型的存储方式解析后存进去的。 进行强制类型转换后,内存空间里面的内容是不会发生改变的,改变的是运算时的临时数据对象的类型,是你去读取这个内存空间时的解析方法。所以,一定要对这个数据类型的内存空间和解析方式有一个清晰的认知。 ## 应用中的注意事项 ### 加括号 类型说明符和多个变量的表达式都必须加括号,如把 ``` (int)(x+y) ``` 写成 ``` (int)x+y ``` 则成了把x转换成int型之后,再与y相加了,完全两个意思。 ### 赋值中的类型转换 当赋值运算符两边的运算对象类型不一样时,规则是把赋值运算符右侧表达式的类型转换为左侧变量的类型。 1. 浮点型与整型 浮点数转换为整数,那么小数点没了;整数转换为浮点数,多了一些0尾巴。 2. 单、双精度浮点型 double型数据转换为float型时,通过截掉尾巴来实现,并且需要四舍五入,反之补0.
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
李肖遥
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交