ImageVerifierCode 换一换
格式:DOCX , 页数:4 ,大小:17.02KB ,
资源ID:8099603      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-8099603.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(不同类型数据之间的类型转换.docx)为本站会员(kpmy5893)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

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

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营业执照举报