2.5 C语言之类型转换

2.5 C语言之类型转换

  • 一、类型转换

一、类型转换

当一个运算符的几个操作数类型不同时,就需要通过一些规则把它们转换为某种共同的类型。

  • 一般来说,自动转换是指把“比较窄的”的操作数转换为“比较宽的”的操作数,并且不丢失信息的转换。例如:
	float f = 1.2;int i = 2;float g = f + i;  // 在计算f+i的时候,将整型变量i的值自动转换为浮点型printf("%f", g);
  • 不允许使用无意义的表达式,例如,不允许把float类型的表达式作为下标
  • 针对可能导致信息丢失的表达式,编译器可能会给出警告信息,比如把较长的整型值赋给较短的整型变量,把浮点型值赋值给整型变量,等等,但这些表达式并不非法。
	float f = 1.2;int i = f; // 将浮点型赋值给整型,丢失信息0.2printf("%d\n", i); // 1i = 128;char j = i; // 将int类型赋值给char类型,128已经超出char类型的范围 -128~127  注意:有些机器的char是无符号时,取值范围为0~255printf("%d\n", j); // -128
  • 将字符类型转换为整型时,我们需要注意一点:C语言中没有指定char类型的变量是无符号还是带符号变量。所以,当把一个char类型的变量转换为int类型的值时,其结果有没有可能是负整数呢?答案是不一定,取决于具体的机器实现。在某些机器中,如果char类型的最左一位为1,则转换为负整数(符号扩展);而在另一些机器中,char类型左边添加0,则转换为正整数。
  • C语言的定义保证了机器的标准打印字符集中的字符不会是负值,因此,在表达式中,这些字符总是正值。但是,存储在字符变量中的位模式在某些机器中可能是负的。所以,为了保证程序的可移植性,如果要在char类型的变量中存储非字符数据,最好指定signed或unsigned限定符。
	unsigned char c = 2;int i = c;printf("%d\n", i);
  • 隐式类型转换规则
    • 二元运算符的两个操作数类型不同
      • 没有unsigned操作数
        • 如果其中一个操作数的类型为long double,则将另一个操作数转换为long double类型
        • 如果其中一个操作数的类型为double,则将另一个操作数转换为double类型(注意:float不会自动转换为double)
        • 如果其中一个操作数的类型为float,则将另一个操作数转换为float类型
        • 将char类型和short类型转换为int类型
        • 如果其中一个操作数的类型为long,则将另一个操作数转换为long类型
      • 有unsigned操作数时,转换规则要复杂一些,主要原因在于,带符号值与无符号值之间的比较运算是与机器相关的,因为它们取决于机器中不同整数类型的大小。例如:假定int类型占16位,long类型占32位,那么,-1L<1U,这是因为unsigned int类型的1U将被提升为signed long类型;但-1L > 1UL,这是因为-1L将被提升为unsigned long类型,因而成为一个比较大的正数。
    • 赋值时,赋值运算符右边的值需要转换为左边变量的类型。
    • 字符型变量都将被转为整型变量
    • 当把较长的整数转为较短的整数或char类型时,超出的高位部分将被丢弃。
    • float转换为int类型时,小数部分将被截取掉
    • double转换为float类型时,是四舍五入还是截取,取决于具体的实现
    • 由于函数调用的参数是表达式,所以把参数传递给函数时也可能进行类型转换。在没有函数原型的情况下,char与short类型将被转换为int类型,float类型将被转换为double类型。因此,即使调用函数的参数为char或float类型,我们也把函数参数声明为int或double类型。
  • 显式类型转换规则
    • 在任何表达式中,都可以使用一个称为强制类型转换的一元运算符强制进行显式类型转换。其形式如:
      (类型名) 表达式
      在上述语句中,表达式首先被赋值给类型名指定的类型的某个变量,然后再用该变量替换上述整条语句。最终结果就是上述表达式被转换为类型名指定的类型,例如库函数sqrt(double),如果给sqrt函数传入一个整数n,可以用 sqrt((double) n),在把n传递给函数之前先将其强制转换为double类型。(注意:强制类型转换只是生成一个指定类型的n的值,n本身并没有改变)
      • 在通常情况下,参数是通过函数原型声明的,这样,当函数被调用时,声明将对参数进行自动强制转换。例如,对于sqrt的函数原型:double sqrt(double); 下列函数调用:
        root = sqrt(2);
        不需要使用强制转换运算符就可以自动将整数2强制转换为double类型的值2.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/583332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构设计系列 5:常见架构介绍

前面讲了架构是什么&#xff0c;架构的发展史&#xff0c;架构设计的基础理论&#xff0c;这次针对常见架构设计风格进行介绍和分析。 一、MVC&#xff1a;三层架构经典 经典的 MVC 架构&#xff08;Model-View-Controller&#xff09;架构是软件系统架构设计中的经典&#xf…

高阶组件和高阶函数是什么

高阶组件和高阶函数都是在函数式编程中常见的概念。 高阶组件&#xff08;Higher-Order Component, HOC&#xff09;是一种函数&#xff0c;接受一个组件作为参数&#xff0c;并返回一个新的组件。它可以用来增强现有的组件&#xff0c;给它添加额外的功能或属性。高阶组件在R…

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)一

第二部分、线性表详解&#xff1a;数据结构线性表10分钟入门 线性表&#xff0c;数据结构中最简单的一种存储结构&#xff0c;专门用于存储逻辑关系为"一对一"的数据。 线性表&#xff0c;基于数据在实际物理空间中的存储状态&#xff0c;又可细分为顺序表&#xff…

【AI】人工智能爆发推进器之变分自动编码器

一、变分自动编码器&#xff08;VAE&#xff09; 变分自动编码器&#xff08;Variational Autoencoder&#xff0c;简称VAE&#xff09;是一种生成式模型&#xff0c;属于深度学习领域中的一种重要技术。它通过结合深度学习和概率图模型的思想&#xff0c;能够学习到数据分布的…

NFC物联网构建移动智能仓储系统解决方案

仓储管理作为企业研发生产活动的重要环节&#xff0c;正朝着标准化、信息化方向发展。高新作为典型的资产密集 技术密集型企业,原料样品为代表的资产数量巨大品种繁杂&#xff0c;对仓库管理的实时性及准确性要求较高。传统的人工作业模式和管理方法逐渐难以满足仓储管理对高效…

【 YOLOv5】目标检测 YOLOv5 开源代码项目调试与讲解实战(4)-自制数据集及训练(使用makesense标注数据集)

如何制作和训练自己的数据集 看yolov5官网创建数据集1.搜索需要的图片2.创建标签标注数据集地址&#xff1a;放入图片后选择目标检测创建文档&#xff0c;每个标签写在单独的一行上传结果此处可以编辑类别把车框选选择类别即可导出数据 3.新建一个目录放数据写yaml文件 4. 测试…

【赠书第14期】AI短视频制作一本通:文本生成视频+图片生成视频+视频生成视频

文章目录 前言 1 前期准备 2 拍摄与录制 3 后期编辑 4 技巧与注意事项 5 推荐图书 6 粉丝福利 前言 随着智能技术的迅猛发展&#xff0c;AI 短视频制作成为了一种新兴而创新的表达方式&#xff0c;广泛应用于社交媒体、广告营销、教育培训等领域。本文将介绍 AI 短视频…

JavaScript介绍,特点及组成(详解)

✨前言✨   本章将介绍 JavaScript 的基本概念、编写方法&#xff0c;并带领大家编写第一个 avaScript 程序。 &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&#xff0c;友友们有任何…

垃圾收集器与内存分配策略

内存分配和回收原则 对象优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 什么是内存泄漏 不再使用的对象在系统中未被回收&#xff0c;内存泄漏的积累可能会导致内存溢出 自动垃圾回收与手动垃圾回收 自动垃圾回收&#xff1a;由虚拟机来自动回收对象…

什么是高并发系统?

1.1 什么是高并发&#xff1f; 高并发&#xff08;High Concurrency&#xff09;&#xff0c;通常是指通过设计保证系统能够同时处理很多请求。即在同一个时间点&#xff0c;有很多的请求同时访问同一个接口。高并发意味着大流量&#xff0c;需要运用技术手段去抵抗这种大流量…

用通俗易懂的方式讲解大模型:Prompt 提示词在开发中的使用

OpenAI 的 ChatGPT 是一种领先的人工智能模型&#xff0c;它以其出色的语言理解和生成能力&#xff0c;为我们提供了一种全新的与机器交流的方式。但不是每个问题都可以得到令人满意的答案&#xff0c;如果想得到你所要的回答就要构建好你的提示词 Prompt。本文将探讨 Prompt 提…

yolov5旋转目标检测-遥感图像检测-无人机旋转目标检测-附代码和原理

综述 为了解决旋转目标检测问题&#xff0c;研究者们提出了多种方法和算法。以下是一些常见的旋转目标检测方法&#xff1a; 基于滑动窗口的方法&#xff1a;在图像上以不同的尺度和角度滑动窗口&#xff0c;通过分类器判断窗口中是否存在目标。这种方法简单直观&#xff0c;…

Flutter 三点二:Dart 异步 async 和 await

async 和 await Future 链式调用 更清晰异步操作依赖关系比较复杂 可使用async awaitasync await 调用逻辑更清晰async await 异常处理 try{}catch(){} 即可async 修饰的方法 总是返回Future对象 不会阻塞主线程await 关键字只有在async修饰的方法内才有效都是把事件交给 Even…

数据可视化能为我们带来哪些好处?

在信息爆炸的时代&#xff0c;数据量呈指数级增长&#xff0c;企业和个人都面临着处理大量信息的挑战。在这个背景下&#xff0c;数据可视化崭露头角&#xff0c;成为解决复杂数据呈现和理解难题的得力工具。那么&#xff0c;数据可视化究竟能为我们带来哪些好处呢&#xff1f;…

SeaTunnel流处理同步MySQL数据至ClickHouse

ClickHouse是一种OLAP类型的列式数据库管理系统&#xff0c;ClickHouse完美的实现了OLAP和列式数据库的优势&#xff0c;因此在大数据量的分析处理应用中ClickHouse表现很优秀。 SeaTunnel是一个分布式、高性能、易扩展、用于海量数据同步和转化的数据集成平台。用户只需要配置…

YOLOv5改进 | 2023注意力篇 | BiFormer双层路由注意力机制(Bi-level Routing Attention)

一、本文介绍 BiFormer是一种结合了Bi-level Routing Attention的视觉Transformer模型&#xff0c;BiFormer模型的核心思想是引入了双层路由注意力机制。在BiFormer中&#xff0c;每个图像块都与一个位置路由器相关联。这些位置路由器根据特定的规则将图像块分配给上层和下层路…

网站提示“不安全”怎么解决

在互联网中&#xff0c;安全问题至关重要。访问某些网站时&#xff0c;可能会遇到“不安全”警告&#xff0c;通常是由于缺乏SSL证书。SSL证书是数字证书&#xff0c;用于确保互联网通信的安全和保密。 “不安全”问题通常源于缺少SSL证书。SSL通过加密通信&#xff0c;防止第三…

力扣labuladong——一刷day80

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣323.无向图中连通分量的数目二、力扣130. 被围绕的区域 前言 并查集&#xff08;Union-Find&#xff09;算法是一个专门针对「动态连通性」的算法&…

mac下jd-gui提示没有找到合适的jdk版本

mac下jd-gui提示jdk有问题 背景解决看一下是不是真有问题了方法一&#xff1a;修改启动脚本方法二&#xff1a;设置launchd环境变量 扩展动态切jdk脚本(.bash_profile) 背景 配置了动态jdk后&#xff0c;再次使用JD-GUI提示没有找到合适的jdk版本。 解决 看一下是不是真有问题…

学习使用wps将ppt的页面保存为图片的方法

学习使用wps将ppt的页面保存为图片的方法 方案 方案 1、打开ppt&#xff0c;点击文件&#xff0c;另存为&#xff0c;选择文件类型为图片格式&#xff0c;jpg或者png&#xff0c;如下图&#xff1a; 2、点击每张幻灯片