隐式类型转换规则

一、实例

例1:unsigned类型与signed char类型的比较

#include<stdio.h>
main()
{
unsigned a = 1;
signed char b = -1;
if(a>b) printf("a>b\n");
else printf("a<=b\n");
}

输出:
a<=b

显然signed char类型在和unsigned比较时发生了隐式类型转换,因为unsigned类型数据长度是4(Byte)x8(bit)=32位,比char(1(Byte)x8(bit)=8位)型显然更长,所以signed char型转化为了unsigned型,对二进制码来说,-1的二进制码是1000 0001,变为unsigned型后,该二进制码对应的十进制数字为129,所以b在比较中由于隐式转换,其值由-1变为了129.故输出为a<=b。

例2:signed类型与unsigned类型的比较

#include<stdio.h>
main()
{
signed a = -1;
unsigned b = 1;
if(a>b) printf("a>b\n");
else if(a==b) printf("a=b\n");
else printf("a<b\n");
}

输出:
a>b

unsigned型的数据精度更高,signed型转化为了unsigned型

例3:signed char类型和unsigned char类型的比较

#include<stdio.h>
main()
{
signed char a = -1;
unsigned char b = 1;
if(a>b) printf("a>b\n");
else if(a==b) printf("a=b\n");
else printf("a<b\n");
}

输出:
a<b

两个char型都转化成了int型

二、比较大小时的隐式转换规则总结

1.优先转化为数据长度较长的数据类型

例1中很好的体现了这点

2.优先转化为数据精度高的类型,保证精度不降低

例2中,unsigned和signed的数据长度都是32位,但unsighed因为没有符号位,所以能表示的数值范围更大,故而精度更高

3.两个类型的长度都低于int时,都先转化为int型再进行比较

常见的长度小于int型(4Byte)的数据类型是short型(2Byte)和char(1Byte)型,例3中,两边都属于char型,在比较时其实先转化为了int型再进行比较,不过一般这个过程对结果没有影响。

三、引申——不同类型数据运算、赋值时发生的隐式转换

保留以上三条规则的同时,还有两条规则:

4.浮点运算都是以double进行的

即float+float的运算过程中,两个数据都被转化为了double型进行运算,所以返回值其实是double型

5.赋值运算时,右边的转化为左边的数据类型

赋值运算时,此规则优先于规则1、2,意味着此时可能会有数据长度、精度的降低!同时针对规则4,float运算后若赋值给float型,double最终还是转化为float型。

最后

本文章参考了作者波吉的代码笔记写的算术运算中的类型转换文章,收获甚多,特此感谢对我学习的帮助!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值