C语言数据类型转换

 

       计算机进行算术运算时,要求各操作数的类型具有相同的大小(存储位数)及存储方式,不能将 char 型( 1 字节)数据与 int 型( 2、4或8字节)数据直接参与运算;由于存储方式的不同,也不能将 int 型数据与 double 型数据直接参与运算。

       然而,由于 C 语言的灵活性,在一个表达式或一条语句中,允许不同类型的数据混合运算。

       C 语言的灵活性与计算机的机械性是一对矛盾,如处理不好,将会产生错误结果。对于某些类型的转换编译器可隐式地自动进行,不需程序员干预,称这种转换为自动类型转换;而有些类型转换需要程序员显式指定,这种类型转换称为强制类型转换

自动类型转换

       一个表达式中出现不同类型间的混合运算,较低类型将自动向较高类型转换。

       不同数据类型之间的差别在于数据的取值范围和精度上,一般情况下,数据的取值范围越大、精度越高,其类型也越“高级”。

       整型类型级别从低到高依次为:

              signed char -> unsigned char -> short -> unsigned short -> int -> unsigned int -> long -> unsigned long

       浮点型级别从低到高依次为:

              float -> double

       float浮点类型被我们弃用了,所以不提它了。

1、操作数中没有浮点型数据时

       当 char、unsigned char、short 或 unsigned short 出现在表达式中参与运算时,一般将其自动转换为 int 类型。

       int 与 unsigned int混合运算时,int自动转换为unsigned int型。

       int、unsigned int 与 long 混合运算时,均转换为 long 类型。

2、操作数中有浮点型数据时

       当操作数中含有浮点型数据时,所有操作数都将转换为 double 型。

       例如:

              int ii=100;

              double dd=200.5;

              ii+dd;

       上述算术表达式中操作数 dd 为double,所以先把 ii转换为double浮点数后再参与运算,运算结果为双精度浮点数300.5。

3、赋值运算符两恻的类型不一致时

       当赋值运算符的右值(可能为常量、变量或表达式)类型与左值类型不一致时,将右值类型可能提升或降低为左值类型。例如:

              double dd;

              dd=10;  // 右值为双精度,左值为整数

       由于左值dd为双精度浮点型,所以先把右值整型常量10 提升为双精度浮点型后,再赋值给 dd,不但不丢失精度反而提高了精度。

              int ii;

              ii=10.5;   // 右值10.5为双精度,左值为整型

       右值双精度型 10.5 降低为左值整型,即10.5舍弃小数部分后,把10 赋给整型变量 ii,这种情况会丢失精度。

4、右值超出左值类型范围时

       更糟糕的情况是,赋值运算符右值的范围超出了左值类型的表示范围,将把该右值截断后,赋给左值。所得结果可能毫无意义。例如:

              char c;           //  char占8位,取值范围是-128-127。

              c=1025;         //  整数1025 对应二进制形式是100 0000 0001,超出了8位。

              printf("%d",c) ;  //  以十进制输出c的值

       该输出结果为 1,因为只取 1025 低 8 位 0000 0001(值为1),赋给字符型变量 c,得到毫无意义的值。

强制类型转换

       虽然自动类型转换不需要人工干预,使用方便,但有利也有弊,尤其当自动类型转换是从较高类型转换为较低类型时,将会降低精度或截断数据,可能得不到预期的结果。

       为了给程序设计人员提供更多的类型转换控制权限,使程序设计更加灵活,转换的目的更加清晰,C 语言提供了可显式指定类型转换的语法,通常称之为强制类型转换。

       强制类型转换的格式为:

              (目标类型) 表达式

       例如:

              int a,b;

              a=4;

              b=3;

              double dd;

              dd=a/b;            // dd的结果将是1。

              dd=(double)(a/b);  // dd的结果是1.000000。

              dd=(double)a/b;   // dd的结果是1.333333

              dd=a/b,dd的结果是1,这个很好理解,因为整数除整数还是整数,没有小数部分。

       dd=(double)(a/b),dd的结果也是1.000000,这个不好理解,它的运算过程是:(1)先运算a/b,得到的结果是整数的1;(2)把整数的1转换成double,是1.000000。

       dd=(double)a/b,dd的结果是1.333333,这个也不好理解,它的运算过程是:(1)先执行(double)a,把a转换为double,即4.000000;(2)把4.00000除以3,得到1.333333,符合自动类型转换的规则。这里还有个问题,程序员搞不清楚是(double)a优先还是a/b优先,最好的办法是写成这样((double)a)/b,这样就没有疑问了。

 

版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言技术网-码农有道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值