C语言从头学18——类型的自动转换

2024-06-10 21:12

本文主要是介绍C语言从头学18——类型的自动转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        某些情况下,C语言会自动转换某个值的类型,以下几种情况有必要了解:
   1、赋值运算过程中类型转换
        赋值运算符会自动将右边的值转成左边变量的类型。
        (1) 浮点数赋值给整数变量,C语言会直接丢弃小数部分,而不是四舍五入。如:
              int x=1.99; //x的值是1而不是2
             这种丢弃对于程序运行中数据的精度有影响,编程过程中必须考虑到。
        (2) 整数赋值给浮点数变量,会自动转变成浮点数,这种转变对精度没有影响。
        (3) 窄类型赋值给宽类型,所谓窄类型即是所占字节数较少的类型,反之就是宽类型。这种转换对程序运算精度没有影响。如:
              char a=127;// char类型占1个字节( 类型占字节数用sizeof()可获得 )
              int x=a; // int类型占4个字节
         (4) 宽类型赋值给窄类型,会发生截值(truncation)现象,还是拿 int 转 char 举例,int占4个字节 char 占一个字节,如把一个 int 类型的值赋给 char 类型变量,int 类型4个字节的值只能将最后一个字节的值传给 char,其余3个字节的值都扔掉了。为了保证精度,这种情况应当尽量避免。但有时我们也反其道而用之,比如需要取整时,我们把float类型值或变量赋给 int 类型变量,就可以达到取整的目的。
   2、混合类型运算中的类型转换
       不同类型的值进行计算时,必须先转成同一个类型才能进行计算。
       (1) 整数与浮点数混合运算时,整数先转为浮点数类型再与另一个运算数运算。如:int 会转成
float或double。
       (2) 不同的浮点数类型混合运算时,宽度较小的类型先转为宽度较大的类型再进行运算,如float 会转成 double。
       (3) 不同的整数类型混合运算时,宽度较小的类型会提升为宽度较大的类型,如short会转为 int。
       在做混合运算时,应避免无符号数与有符号数的混合运算。因为这时C语言会自动将有符号数转为无符号数,这种转变可能会超出预期。当然这种情况也极为少见。
      事实上,上述类型的自动转换在我们编程过程中应当尽量避免,因为可能发生不可预见的结果。但有时类型的转换又是必须进行的,下一篇文章将介绍"类型的显示转换"。
     写一个简单的例子对上面的介绍再做进一步的说明:

#include<stdio.h>
int main(void)
{//浮点数赋值给整型float PI = 3.14159, r = 1;int S = r * r * PI; //小数部分被舍去(等号右边先计算出结果后再舍小数)printf("S=%d\n", S); //运行结果:S=3 
//整数赋值给浮点数int a1 = 3;float b1 = a1;//不影响精度printf("float b1=%f\n", b1);//运行结果:float b1=3.000000 
//窄类型赋值给宽类型short a2 = 32767;long b2 = a2;//不影响精度printf("long b2=%d\n", b2); //运行结果:long b2=32767 
//宽类型赋值给窄类型double x1 = 1234567890.123456;float y1=x1; //小数部分和整数部分都有变化,发生错误printf("y1=%f\n", y1); //运行结果:y1=1234567936.000000 
//整数与浮点数混合运算float x2 = 3.14;int a3 = 2; float y3 = a3 * x2; //a3自动转为floatprintf("y3=%f\n", y3); //运行结果:y3=6.280000
//不同宽度浮点类型混合运算float x3 = 0.511; double x4 = 0.722111;double y4 = x3 + x4;//x3自动转成doubleprintf("y4=%f\n", y4); //运行结果:y4=1.233111getchar(); //阻塞程序运行return 0;
}


 

这篇关于C语言从头学18——类型的自动转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049278

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ