收藏 分享(赏)

不同类型数据之间的类型转换.docx

上传人:kpmy5893 文档编号:8099603 上传时间:2019-06-08 格式:DOCX 页数:4 大小:17.02KB
下载 相关 举报
不同类型数据之间的类型转换.docx_第1页
第1页 / 共4页
不同类型数据之间的类型转换.docx_第2页
第2页 / 共4页
不同类型数据之间的类型转换.docx_第3页
第3页 / 共4页
不同类型数据之间的类型转换.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、不同类型数据之间的类型转换机器语言的算术运算指令比 C 语言算术表达式的限制更多。为了让计算机执行机器指令中的算术运算,通常不仅要求两个操作数有相同的长度(字节数),而且还要求数据的存储方式也相同。比如同是单精度浮点型数。在 C 语言中,最好把同类型的常量值赋给同一类型的变量,或者使用同类型的常量和变量进行算术运算或关系运算。然而在 C 语言程序中,允许在表达式中混合使用各种不同类型的数据。在一个表达式中,可以同时出现整型、浮点型、字符型的常量和变量。在这种情况下,C 语言编译程序通常需要生成一些附加的指令,在执行一条运算类指令之前,将其中一个操作数的类型转换成另一个操作数的类型。下面讨论的类

2、型转换都是有符号型的变量和常量之间的类型转换,不涉及无符号的变量(和常量)。这适用于常规的编程应用范围。一些高级语言(比如 Java 语言),就只有有符号型的常量和变量。类型转换分为自动类型转换和强制类型转换两种。自动类型转换指的是编译器在将语句(或表达时)翻译成指令时,由编译程序自动进行的类型转换。在以下四种情况中会出现自动类型转换:1)二元算术运算符或关系运算符两边的操作数类型不一致。2)赋值运算符两边的操作数类型不一致。3)函数调用时实际参数与形式参数要求的类型不一致。4)函数调用结束时返回值的类型与要求的类型不一致。其中,第 3 种和第 4 种类型转换讨论,请参见第 7 章。本章以下仅

3、讨论前两种情况下的自动类型转换。(1)算术或关系表达式中的类型转换在算术(或者关系)表达式中,出现在二元运算符两侧的运算量可以是不同类型的,这时就涉及类型之间的转换问题。如果没有出现强制类型转换,那么简单的自动类型转换规则分为三种:1)只要两个操作数中出现了 char 类型或 short 型,首先都将无条件地自动提升为 int 型。2)在两个操作数的类型都不是浮点型的情况下,自动进行了第一种规定的无条件的类型提升之后,按照以下方式对操作数的类型再次进行有条件的提升。这个条件是两个操作数之中有一个数是 long 型,即将 int 提升为 long 型。举例来说,对于“short n1 ; lon

4、g num;”,要求计算表达式 n1 + num。编译器先将变量 n1 自动提升为 int 型。由于两个操作数中有一个变量 num 是 long 型,因此,刚刚提升为 int 型的变量 n1 的值将再次提升为 long 型。延伸与拓展:整型类型提升的技术内幕增加临时存放此数的字节和对这些字节进行符号位的扩展,这是由于计算机是用补码来表示有符号整数的。只有对补码进行符号位的扩展,补码表示的值才不会改变。参见本章提高部分有关补码的讨论。3)两个操作数都是浮点数或者其中有一个是浮点数的情况下,提升规则如下:long double (这是 C99 标准规定的类型)double float 也就是说:如

5、果在一个表达式(或一个二元算数或关系运算符)中出现了 long double 型的运算量,则此表达式计算出的最终值是 long double 型的。如果一个表达式(或一个二元算数或关系运算符)中出现了 double 型的运算量(但没有出现long double 型量),则此表达式计算出的最终值是 double 型的。如果一个表达式(或一个二元算数或关系运算符)中出现了 float 型的运算量(但没有出现double 型量或 long double 型量),则此表达式计算出的最终值是 float 型的。如果两个操作数中还有一个 int 型或 long 型的整型量,那么此整型数就会根据另一个浮点操

6、作数的类型进行转换。读者还要注意的是:数据类型的转换,并不是在计算表达式的值之前一次性完成的,而是根据规定的运算顺序,逐步进行类型转换的。例如,对于如下表达式:56.91+A*32是先按照转换规则,将 char 型的量A转变为 int 型值(第一种类型提升)进行乘法运算;得到一个整数值以后,再按照转换规则转变成 double 型(这是由于前一个参与运算的常量 59.61 被系统默认为 double 型常量),然后再与 56.91 进行双精度浮点数加法运算。(2)赋值语句(或赋值表达式)中的类型转换在赋值语句(或赋值表达式)中,如果赋值运算符右边表达式计算结果的类型与左边变量的类型不一致,则会自

7、动进行类型转换。类型转换的规则很简单:将表达式计算出的值转变成赋值号左边变量的类型。如果赋值号右边的数据类型的取值范围宽于左边变量类型的取值范围,通常会发生精度的额外丢失或者错误。例如,如果定义“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=

8、d_int;d_int =d_float;d_float= d_double;通常都会出现问题。对于第 1 条语句“d_char= d_int;”,在 d_int 的值超过 255 时,在 char 只占 8 位内存的计算机上必然出错(溢出)。即使 d_int 的取值在 128255 之间,也不一定正确。这要看你正在使用的 C 编译器中,char 类型本质上到底是有符号的整数(取值在128127 之间)还是无符号的整数(取值在 0255 之间)。如果是前者,就会出现把一个正整数变成了一个负整数并且存放到变量d_char 中的错误。对于第 2 条语句“d_int =d_float;”,必然会使

9、d_float 的小数部分丢失(不会四舍五入)。更为严重的是,如果 d_float 的值超出了 int 类型的取值范围(这或许是很常见的,因为有些 C 编译器中,int 型的最大值是 32767),那么变量 d_int 中的值也必然出错(溢出)。第 3 条语句的情况,读者可自行分析。(3)强制类型转换如果自动类型转换满足不了需要,则可以要求编译程序进行强制类型转换。强制类型转换是通过使用强制类型转换运算符(由圆括号括住类型名构成)来实现的。其格式为:(类型名)(被转换的表达式)其功能是把表达式的运算结果,强制转换成类型名所给定的类型。例如,(float) m 把整型变量 m 的值强制转换为单精

10、度浮点型。(int)(3.86*xy)把表达式 3.86*xy 的值强制转换为整型。在进行强制类型转换时应注意:类型名必须用圆括号括住,不能省略;需进行类型转换的表达式也要加圆括号(单个变量或常量可以不加括号)。例如,如果错把(int)(xy)写成(int)xy,则会出现仅仅把 x 转换成 int 类型之后,再与 y 相加的问题。以下两种情况下要使用强制类型转换:1)如果担心两个 float 型量 x,y 的乘积超出 float 型的表示范围(即产生溢出),那就要这样书写语句:z=(double )x*y;。其中,变量 z 是 double 类型,y 的类型会自动提升为 double 型。注意

11、,另一个很类似的语句:z=(double )(x*y);是错误的,因为在进行强制类型转换前,x*y 的乘积值很可能已经超出了 float 型的表示范围。2)如果担心两个 int 型量 i,j 的乘积超出 int 型的表示范围,那就要这样书写语句: k=(long int )i*j;,其中 k 是 long int 类型的变量。强制类型转换如果使用不当,出现的问题与赋值语句中自动类型转换的类似。注意:无论是强制类型转换或是自动类型转换,都只是为了本次运算的需要而对从变量中取出的值进行的临时性转换,不会改变变量定义时对该变量指定的类型,也不会改变变量所对应内存单元中存放的值。无符号的变量(和常量)之间的类型转换,与本节讨论的情况完全类似。强烈建议读者在通常应用中不要在表达式中使用无符号的常量与变量。无符号的常量和变量最好局限于应用在系统编程和嵌入式编程方面。所以,读者应尽量避免在同一个表达式中,同时使用有符号和无符号的量。无符号与有符号量之间的类型转换的讨论,请读者参考相关的教科书。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报