IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 从零开始学习C语言丨基本数据类型的转换 -> 正文阅读

[C++知识库]从零开始学习C语言丨基本数据类型的转换

CSDN话题挑战赛第2期
参赛话题:学习笔记

?上一篇文章,学习了C语言的6种基本数据类型。这篇文章就来聊一聊,基本数据类型之间的转换。

什么是类型转换?就是将数据(变量、数值、表达式结果等)从一种类型转换到另一种类型。但这种改变并不是发生在原本数据上,一般都是创建一个新的类型变量来承载转换类型的数据。

为什么在程序中需要进行类型改变呢?来举一个小小的栗子:

在现实生活中,我们现在有一群人的成绩(数值为整数),我们需要计算他们的平均数。实际情况中,整数相除有可能是整数,也有可能是小数。

但是在C语言当中,两个整数相除,结果依然是整数。但如果实际结果是有小数部分的,那这样的数据就失真了,因此就需要用到了类型转换。

来看一段计算代码:

#include<stdio.h>
int main(){
    int a = 5;
    int b = 2;
    double c = a / b;
    printf("%f", c);
    return 0;
}

运行出来的结果是:2.000000.

但实际上,这个运行结果并不是我们想要的。我们都知道?5 除以 2 是等于 2.5,为什么这里却变成了2.000000呢?

这就是前面提到的,在C语言程序当中,两个整数相除,结果还是整数。5 除以 2 虽然是等于 2.5,但是由于结果只能是整数,所以丢弃了小数部分。

但是为什么,还会有小数点呢?这里就涉及到了类型转换的知识了。

类型转换,一共有两种形式,一种是自动转换,也叫作隐式转换;另一种是强制转换,也叫作显式转换。

自动转换

是编译根据代码上下文环境自行判断的结果。

这种转换方式,是系统自己默默地执行,是暗地里的,所以也叫作隐式。就像老板让你去订一家饭馆,但没有告诉你细节问题。那能怎么办?就只能根据以往的经验去订鲁菜馆。但这种凭经验、凭理解,就会存在一个问题,谁知道老板今天请的客人会不会吃得惯这家饭馆的菜呢?

所以说,自动转换是一种不安全的转换方式,可能会存在数据失真、精度缺失等问题。

就像我们上面的那一段计算代码,就发生了数据失真的问题了。

那像这种情况应该要怎么解决呢?这就要提另一种转换方式,强制转换。

强制转换

是程序员明确提出要进行的类型转换,用特定的代码格式去指定某一种类型的转换。

同样是老板让你去订饭店,但会跟你说今天请的这个客人他是四川人,从小在湖南长大,无辣不欢,去定一家川菜馆或者湘菜馆。这样子目标就很明确了,就不会盲目地定一家鲁菜馆了。

强制转换是有特定的代码格式来进行转换的:

typename?variable?=?(typename)?expression

typename?即数据的类型;variable 即变量;expression 可以是具体的值、某个变量、某个表达式等等。

在前面的那段计算代码中加上对某个 int 类型进行强制转换之后,再来看看结果是什么样的:

#include<stdio.h>
int main(){
??int a = 5;
??int b = 2;
??double?c?=?(double)a/b;
??printf("%f",?c);
??return 0;
}

运行结果:2.500000。

OK,符合预期的结果了!

看到这里,肯定有人又有疑惑了,为什么不直接把 a/b 括号起来然后进行转换?为什么只转换其中一个,结果就正确了呢?

首先第一个问题,这是因为如果括号起来,那么首先计算的是 a/b,仍旧是两个整数相除,结果还是 2,然后经过 double 转换,运行的结果就和上面的一样,都是2.000000。

第二个问题,为什么只转换其中一个。这是因为在C语言中,不同类型的数据在进行操作的时候,首先会根据转换规则将这两种不同类型转换为同一种类型。而转换的规则,是由低级向高级转换,具体如下图所示:

注:unsigned 即 unsigned int。

当然,你不嫌麻烦,也可以一个个进行强制转后再进行运算。

那么强制转换就一定安全吗?

如果你老板不知道邀请的这位客人,因为吃辣的吃腻了,突然想要换个口味,吃个鲁菜。那你都执行下去了,结果很有可能就是项目黄了。

所以,强制转换也不是绝对安全的。程序员在进行强制转换的时候,一定要时刻保持警惕,要问自己进行转换后数据会不会发生丢失,是否可能存在非方访问,如果可以回答这两个问题,并且能控制所有可能会发生的情况,就可以大胆尝试去进行强制转换。

类型转换是临时的

无论是自动转换,还是强制转换,目的都是为了本次运算而进行的一次临时变换。转换的结果是临时保存在内存中的,而并不会改变原本的值。

来看一个例子:

#include<stdio.h>
int main(){
??int a = 5;
??int b = 2;
??double?c?=?(double)a/b;
??printf("%f",?c);
??return 0;
}

运行结果:a=10.550000,a_i=10

代码中,double 类型的 a 变量通过强制转换的方式将其转换为 int 类型,并将值赋给了 a_i 变量,这种转换并没有影响到 a 变量本身的值或者类型。

如果 a 变量的值发生了改变,那么输出的结果应该是 10.000000。

最后

关于基本数据类型之间的转换内容就讲到了这里。文章中可能会存在一些缺漏的知识点,大家如果有什么想法或者疑惑可以在评论区留言,一起交流学习。最后,感谢大家的观看!

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:33:07  更:2022-09-30 00:34:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 5:05:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码