C语言数据类型转换详解

article/2025/10/5 19:23:14

数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。

自动类型转换

自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

1 . 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如:

float f = 150;

150 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f。再如:

int n = f;

f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。

在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。

2 . 在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下:

	转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。char 和 short 参与运算时,必须先转换成 int 类型。

下图对这种转换规则进行了更加形象地描述:
在这里插入图片描述

	unsigned 也即 unsigned int,此时可以省略 int,只写 unsigned。

自动类型转换示例:

#include<stdio.h>
int main(){float PI = 3.14159;int s1, r = 5;double s2;s1 = r * r * PI;s2 = r * r * PI;printf("s1=%d, s2=%f\n", s1, s2);return 0;
}

运行结果:

s1=78, s2=78.539749

在计算表达式rrPI时,r 和 PI 都被转换成 double 类型,表达式的结果也是 double 类型。但由于 s1 为整型,所以赋值运算的结果仍为整型,舍去了小数部分,导致数据失真。

强制类型转换

自动类型转换是编译器根据代码的上下文环境自行判断的结果,有时候并不是那么“智能”,不能满足所有的需求。如果需要,程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。

自动类型转换是编译器默默地、隐式地进行的一种类型转换,不需要在代码中体现出来;强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。

强制类型转换的格式为:

(type_name) expression

type_name为新类型名称,expression为表达式。例如:

(float) a;  //将变量 a 转换为 float 类型
(int)(x+y);  //把表达式 x+y 的结果转换为 int 整型
(float) 100;  //将数值 100(默认为int类型)转换为 float 类型

强制类型转换示例:

#include <stdio.h>
int main(){int sum = 103;  //总数int count = 7;  //数目double average;  //平均数average = (double) sum / count;printf("Average is %lf!\n", average);return 0;
}

运行结果:

Average is 14.714286!

sum 和 count 都是 int 类型,如果不进行干预,那么sum / count的运算结果也是 int 类型,小数部分将被丢弃;虽然是 average 是 double 类型,可以接收小数部分,但是心有余力不足,小数部分提前就被“阉割”了,它只能接收到整数部分,这就导致除法运算的结果严重失真。

既然 average 是 double 类型,为何不充分利用,尽量提高运算结果的精度呢?为了达到这个目标,我们只要将 sum 或者 count 其中之一转换为 double 类型即可。上面的代码中,我们将 sum 强制转换为 double 类型,这样sum / count的结果也将变成 double 类型,就可以保留小数部分了,average 接收到的值也会更加精确。

在这段代码中,有两点需要注意:
1 . 对于除法运算,如果除数和被除数都是整数,那么运算结果也是整数,小数部分将被直接丢弃;如果除数和被除数其中有一个是小数,那么运算结果也是小数。

2 . ( )的优先级高于/,对于表达式(double) sum / count,会先执行(double) sum,将 sum 转换为 double 类型,然后再进行除法运算,这样运算结果也是 double 类型,能够保留小数部分。注意不要写作(double) (sum / count),这样写运算结果将是 3.000000,仍然不能保留小数部分。

类型转换只是临时性的

无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。请看下面的例子:

#include <stdio.h>
int main(){double total = 400.8;  //总价int count = 5;  //数目double unit;  //单价int total_int = (int)total;unit = total / count;printf("total=%lf, total_int=%d, unit=%lf\n", total, total_int, unit);return 0;
}

运行结果:

total=400.800000, total_int=400, unit=80.160000

注意看第 6 行代码,total 变量被转换成了 int 类型才赋值给 total_int 变量,而这种转换并未影响 total 变量本身的类型和值。如果 total 的值变了,那么 total 的输出结果将变为 400.000000;如果 total 的类型变了,那么 unit 的输出结果将变为 80.000000。

自动类型转换 VS 强制类型转换

在C语言中,有些类型既可以自动转换,也可以强制转换,例如 int 到 double,float 到 int 等;而有些类型只能强制转换,不能自动转换,例如 void * 到 int *,int 到 char * 等。

可以自动转换的类型一定能够强制转换,但是,需要强制转换的类型不一定能够自动转换。

可以自动进行的类型转换一般风险较低,不会对程序带来严重的后果,例如,int 到 double 没有什么缺点,float 到 int 顶多是数值失真。只能强制进行的类型转换一般风险较高,例如,char * 到 int * 就是很奇怪的一种转换,这会导致取得的值也很奇怪,再如,int 到 char * 就是风险极高的一种转换,一般会导致程序崩溃。

你的赞是对我最大的支持!!!


http://chatgpt.dhexx.cn/article/GL0IUC0W.shtml

相关文章

Java的数据类型转换

Java的数据类型转换分为以下的两种&#xff1a; 一、自动类型转换 首先我们要了解自动类型转换是什么&#xff0c;为什么要进行自动类型转换呢&#xff1f; 1.自动类型转换就是类型范围小的变量&#xff0c;可以直接赋值给类型范围大的变量。比如以下代码&#xff1a; 其中int类…

Python 中数据类型转换

前两篇回顾&#xff1a; 第一篇&#xff1a;环境搭建以及运行 Python 的 3 种方式 第二篇&#xff1a;变量及数据类型 今天是 Python 基础系列第三篇&#xff1a;三种数据类型转换形式&#xff08;布尔值转换、字符串转换、数值转换&#xff09;。 一、转为布尔值 一&#xf…

C语言数据类型转换

文章目录 前言一、类型自动转换二、赋值转换三、强制类型转换 前言 C语言中&#xff0c;整型、单精度型、双精度型和字符型数据可以进行混合运算。字符型数据可以得与整型通用。例如&#xff1a; 100′A′8. . 65-2456. 75′a′是一个合法的运算表达式。在进行运算时&#xf…

数据类型的转换

数据类型转换分为两种&#xff1a;自动类型转换和强制类型转换。 一、自动类型转换 ①转换前的数据类型与转换后的类型兼容。 ②转换后的数据类型的表示范围比转换前的类型大。 条件②说明不同类型的数据进行运算时&#xff0c;需先转换为同一类型&#xff0c;然后进行运算。…

数据类型转换

数据类型转换 首先&#xff0c;数据类型一共有6种&#xff0c;分别是字符串、布尔值、数值、空值、未定义和对象。 其中基本数据类型&#xff1a; 1、number数值类型&#xff1a;在JS中所有的数值都是Number类型&#xff0c;包括了整数、浮点数(小数) - 拓展部分&#xff1a…

Java全栈开发

2022年9月6日更新 更多见 个人掘金收藏 写了一个小工具 &#xff0c;可以点击查看和搜索&#xff0c;见这篇博客 JavaFx入门5 - 一个小工具的实现 网上的一些Java全栈开发技术汇总 代码更新 &#xff1a;https://git.code.tencent.com/Java66/openJava.git 目录 比较好的…

java appkey_Java全栈工程师 风袖 appkey

Java全栈工程师 全局性思维 现代项目的开发&#xff0c;需要掌握多种技术。互联网项目&#xff0c;需要用到后端开发、前端开发、界面设计、产品设计、数据库、各种移动客户端、三屏兼容、restFul API设计和OAuth等等&#xff0c;比较前卫的项目&#xff0c;还会用到Single Pag…

Java全栈进阶

https://shq5785.blog.csdn.net/

java全栈前景_Java全栈开发哪个发展前景好

原标题&#xff1a;Java全栈开发哪个发展前景好 全栈和java哪个能更好迎合市场需求&#xff0c;有同学咨询学习哪个在以后前景和工作薪水上能更吃香&#xff0c;首先我们先来了解下Java开发和全栈开发的区别。 全栈开发工程师是指掌握多种技能&#xff0c;能够独立开发应用程序…

Java全栈工程师学习路线(思维导图)送你进大厂

当今软件行业中&#xff0c;Java是最流行的编程语言之一。许多企业都需要Java开发人员来构建和维护应用程序。因此&#xff0c;作为一名Java开发人员&#xff0c;学习Java编程语言和相关技术是至关重要的。下面是一些Java学习路线的建议&#xff1a; 目录 Java 基础Java高级We…

零基础Java全栈教程--全文目录

文章目录 1. 教程结构2. 教程目录2.1 HTML篇2.2 CSS篇2.3 JS篇2.4 Java 语言基础篇2.5 Java Web基础篇2.6 JSJava项目实战篇2.7 jQuery篇2.8 BootStrap篇2.9 Java SSM篇2.10 BootStrapSSM项目实战篇2.11 ESWebpack篇2.12 Vue篇2.13 Element篇2.14 SpringBoot篇2.15 VueSpringBo…

Java全栈学习路线

在学习Java苦于没有自己的完整学习步骤&#xff0c;下面是一个大概的学习路线&#xff1a; 一、Java基础 二、JavaWeb 三、SSM框架 四、Linux运维 五、微服务和分布式 六、大数据开发 七、持续学习 总结&#xff1a; 目前自己正处于一个找工作的阶段&#xff0c;也希望这些学…

java全栈开发主要工作内容,java全栈工程师

KEYRESPONSIBILITIES: •Code,testandreleasechangesasperstandardCitiguidelines •Provideanalysisandwritefunctional&technicalspecifications •Communicateandworkcloselywithpeerdevelopersofglobalteam •HandleBAUactivities,includingidentifyingandresolvingbug…

java全栈知识点[面试篇](一)

jjava全栈知识点[面试篇]&#xff08;一&#xff09; 阻塞与等待的状态转变⭐Synchronized本质上是通过什么保证线程安全的?volatile、synchronized和Lock如何保证可见性⭐Synchronized使得同时只有一个线程可以执行&#xff0c;性能比较差&#xff0c;有什么提升的方法?⭐sy…

java面试必问,java全栈面试题

一、前言 有句话&#xff1a;正因为你优秀&#xff0c;所以难以卓越&#xff01; 刚开始听这句话还在上学&#xff0c;既不卓越、也不优秀&#xff0c;甚至可能还有点笨&#xff01;但突然从某次爬到班级的前几名后&#xff0c;开始喜欢上了这种感觉&#xff0c;原来前面的风…

从搬砖工到架构师,Java全栈学习路线总结

&#x1f307;文章目录 前言一、前置知识二、 Web前端基础示例&#xff1a;1.文本域2.密码字段 三、后端基础一. Java基础二. 数据库技术三. Web开发技术四. 框架技术五. 服务器部署 四、其他技术五、全栈开发六、综合实践七、学习教程一、前端开发二、后端开发三、数据库开发四…

java全栈(java全栈开发工程师)

如何记录Java栈区的指针&#xff1f; optop,frame和vars用于记录指向Java栈区的指针 Java全栈工程师在未来的发展如何&#xff1f; 全栈工程师是指网站开发所有东西都要负责(即前端和后端都要负责)&#xff0c;前端是指网站的网页设计&#xff0c;后端是指网站的数据动态变化&a…

1. JAVA全栈知识体系--- Java基础

1. JAVA全栈知识体系— Java基础 文章目录 1. JAVA全栈知识体系--- Java基础1.1 语法基础面向对象特性&#xff1f;a a b 与 a b 的区别3*0.1 0.3 将会返回什么? true 还是 false?能在 Switch 中使用 String 吗?对equals()和hashCode()的理解&#xff1f;final、finaliz…

Java 全栈知识体系

40000 字长文总结。 全栈知识体系总览 Java入门与进阶 面向对象与Java基础 Java 基础 - 面向对象 Java 基础 - 知识点 Java 基础 - 图谱 & Q/A 基础知识点复习完了以后&#xff0c;我们需要深入的理解Java中的一些基础机制&#xff1a; Java 基础 - 泛型机制详解 Java…

Java全栈体系路线(总结不易,持续更新中)

文章目录 Java全栈工程师<font colororange>Java基础基础语法面向对象工具类集合框架序列化反射机制注解文件处理设计模式视频教程文档教程练习题面试题GUI模块多线程模块Socket模块JDBC模块数据库操作起步JDBC执行sql数据库进阶操作JDBC进阶视频教程文档教程 JVM教程基础…