全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
不同类型数据之间的类型转换不同类型数据之间的类型转换 机器语言的算术运算指令比 C 语言算术表达式的限制更多 为了让计算机执行机器指令中的算 术运算 通常不仅要求两个操作数有相同的长度 字节数 而且还要求数据的存储方式也相同 比如同是单精度浮点型数 在 C 语言中 最好把同类型的常量值赋给同一类型的变量 或者使用同类型的常量和变量进行 算术运算或关系运算 然而在 C 语言程序中 允许在表达式中混合使用各种不同类型的数据 在一个表达式中 可以 同时出现整型 浮点型 字符型的常量和变量 在这种情况下 C 语言编译程序通常需要生成一些 附加的指令 在执行一条运算类指令之前 将其中一个操作数的类型转换成另一个操作数的类型 下面讨论的类型转换都是有符号型的变量和常量之间的类型转换 不涉及无符号的变量 和常 量 这适用于常规的编程应用范围 一些高级语言 比如 Java 语言 就只有有符号型的常量和 变量 类型转换分为自动类型转换和强制类型转换两种 自动类型转换指的是编译器在将语句 或表 达时 翻译成指令时 由编译程序自动进行的类型转换 在以下四种情况中会出现自动类型转换 1 二元算术运算符或关系运算符两边的操作数类型不一致 2 赋值运算符两边的操作数类型不一致 3 函数调用时实际参数与形式参数要求的类型不一致 4 函数调用结束时返回值的类型与要求的类型不一致 其中 第 3 种和第 4 种类型转换讨论 请参见第 7 章 本章以下仅讨论前两种情况下的自动类型转换 1 算术或关系表达式中的类型转换 在算术 或者关系 表达式中 出现在二元运算符两侧的运算量可以是不同类型的 这时就涉 及类型之间的转换问题 如果没有出现强制类型转换 那么简单的自动类型转换规则分为三种 1 只要两个操作数中出现了 char 类型或 short 型 首先都将无条件地自动提升为 int 型 2 在两个操作数的类型都不是浮点型的情况下 自动进行了第一种规定的无条件的类型提升 之后 按照以下方式对操作数的类型再次进行有条件的提升 这个条件是两个操作数之中有一个数 是 long 型 即将 int 提升为 long 型 举例来说 对于 short n1 long num 要求计算表达式 n1 num 编译器先将变量 n1 自动提升为 int 型 由于两个操作数中有一个变量 num 是 long 型 因此 刚刚提升为 int 型的 变量 n1 的值将再次提升为 long 型 延伸与拓展 整型类型提升的技术内幕 增加临时存放此数的字节和对这些字节进行符号位的扩展 这是由于计算机是用补码来表示有 符号整数的 只有对补码进行符号位的扩展 补码表示的值才不会改变 参见本章提高部分有关补 码的讨论 3 两个操作数都是浮点数或者其中有一个是浮点数的情况下 提升规则如下 long double 这是 C99 标准规定的类型 double float 也就是说 如果在一个表达式 或一个二元算数或关系运算符 中出现了 long double 型的运算量 则 此表达式计算出的最终值是 long double 型的 如果一个表达式 或一个二元算数或关系运算符 中出现了 double 型的运算量 但没有出现 long double 型量 则此表达式计算出的最终值是 double 型的 如果一个表达式 或一个二元算数或关系运算符 中出现了 float 型的运算量 但没有出现 double 型量或 long double 型量 则此表达式计算出的最终值是 float 型的 如果两个操作数中还有一个 int 型或 long 型的整型量 那么此整型数就会根据另一个浮点操 作数的类型进行转换 读者还要注意的是 数据类型的转换 并不是在计算表达式的值之前一次性完成的 而是根据 规定的运算顺序 逐步进行类型转换的 例如 对于如下表达式 56 91 A 32 是先按照转换规则 将 char 型的量 A 转变为 int 型值 第一种类型提升 进行乘法运算 得 到一个整数值以后 再按照转换规则转变成 double 型 这是由于前一个参与运算的常量 59 61 被系 统默认为 double 型常量 然后再与 56 91 进行双精度浮点数加法运算 2 赋值语句 或赋值表达式 中的类型转换 在赋值语句 或赋值表达式 中 如果赋值运算符右边表达式计算结果的类型与左边变量的类 型不一致 则会自动进行类型转换 类型转换的规则很简单 将表达式计算出的值转变成赋值号左 边变量的类型 如果赋值号右边的数据类型的取值范围宽于左边变量类型的取值范围 通常会发生精度的额外 丢失或者错误 例如 如果定义 char d char int d int float d float double d double 那么以下赋值语句 或赋值表达式 是不会有任何问题的 因为右边的数据类型 不宽于 左 边变量类型的取值范围 d int d char d float d int d double d float 但是 如果将以上几条赋值语句 或赋值表达式 中的变量调换位置 d char d int d int d float d float d double 通常都会出现问题 对于第 1 条语句 d char d int 在 d int 的值超过 255 时 在 char 只占 8 位内存的计 算机上必然出错 溢出 即使 d int 的取值在 128 255 之间 也不一定正确 这要看你正在使用 的 C 编译器中 char 类型本质上到底是有符号的整数 取值在 128 127 之间 还是无符号的整数 取值在 0 255 之间 如果是前者 就会出现把一个正整数变成了一个负整数并且存放到变量 d char 中的错误 对于第 2 条语句 d int d float 必然会使 d float 的小数部分丢失 不会四舍五入 更为严重的是 如果 d float 的值超出了 int 类型的取值范围 这或许是很常见的 因为有些 C 编 译器中 int 型的最大值是 32767 那么变量 d int 中的值也必然出错 溢出 第 3 条语句的情况 读者可自行分析 3 强制类型转换 如果自动类型转换满足不了需要 则可以要求编译程序进行强制类型转换 强制类型转换是通 过使用强制类型转换运算符 由圆括号括住类型名构成 来实现的 其格式为 类型名 被转换的表达式 其功能是把表达式的运算结果 强制转换成类型名所给定的类型 例如 float m 把整型变 量 m 的值强制转换为单精度浮点型 int 3 86 x y 把表达式 3 86 x y 的值强制转换为整型 在进行强制类型转换时应注意 类型名必须用圆括号括住 不能省略 需进行类型转换的表达 式也要加圆括号 单个变量或常量可以不加括号 例如 如果错把 int x y 写成 int x y 则会出现仅仅把 x 转换成 int 类型之后 再与 y 相加的问题 以下两种情况下要使用强制类型转换 1 如果担心两个 float 型量 x y 的乘积超出 float 型的表示范围 即产生溢出 那就要这 样书写语句 z double x y 其中 变量 z 是 double 类型 y 的类型会自动提升为 double 型 注意 另一个很类似的语句 z double x y 是错误的 因为在进行强制类型转换前 x y 的乘 积值很可能已经超出了 float 型的表示范围 2 如果担心两个 int 型量 i j 的乘积超出 int 型的表示范围 那就要这样书写语句 k long int i j 其中 k 是 long int 类型的变量 强制类型转换如果使用不当 出现的问题与赋值语句中自动类型转换的类似 注意 无论是强制类型转换或是自动类型转换 都只是为了本次运算的需要而对从变量中取出 的值进行的临时性转换 不会改变变量定义时对该变量指定的类型 也不会改变变量所
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CSPIA 005-2021公共安全视频图像分析多算法应用技术要求
- T/YYHG 0006-2023注射剂配液分配自控系统实施规范
- T/HAEPCI 45-2022农田土壤重金属污染修复与管控方案编制规范
- T/CIE 207-2024Linux操作系统内核接口调用参考规范
- T/CAOE 47-2023大洋多金属结核资源量估算技术指南
- T/CSAE 465-2025乘用车智能底盘矢量控制及舒适加减速控制道路测试方法
- 2025-2026学年黑龙江省鸡西市初中数学九年级期末上册模考能力提升卷详细参考解析
- PHP 初级面试题及详细答案(真实企业版)
- 2026年教育系统后备干部笔试试题及答案
- PET-CT物理师专业考核试题及详细答案
- 2026年建筑安全员C证考试真题及答案
- 2026年纪检监察案件查办政策考试题及答案
- 2026年江苏省粮食集团有限责任公司人员招聘笔试备考题库及详细答案解析
- 2026年普法考试题目(+答案解析)
- 《物流场所消防安全管理》XFT 3026-2026
- 2026年秋新版道德与法治(道法)六年级上册全册分课时作业附答案
- 2025年县属国有企业招聘考试笔试试题(含答案)
- 可压缩流体管道阻力降计算表
- 分布式光伏发电系统建设规范
- 企业商业秘密保护技术应用调研报告
- 物业服务满意度调研问卷设计
评论
0/150
提交评论