一、实例
例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型。
最后
本文章参考了作者波吉的代码笔记写的算术运算中的类型转换文章,收获甚多,特此感谢对我学习的帮助!