运算时的数据类型提升
今天来分析测试一下这个很多人迷糊的地方,因为有些老师在这个地方讲得有待商榷。
一种常见说法是:无符号和有符号数进行运算时,类型被提升为无符号类型。
这也是我当初听老师讲课时的说法。
test1:
1 signed int ch=-10; 2 unsigned int ch1=5; 3 if(ch-ch1>0) 4 printf("ch-ch1>0\n"); 5 if(ch-ch1<0) 6 printf("ch-ch1<0\n");
ch类型提升为unsigned int,-10的二进制补码是个很大的正整数,减去5大于0,所以输出
printf("ch-ch1>0\n");
这里并没有什么特殊,但是,随着代码量的累计,我们发现了另外一个问题:
test2:
1 signed char ch=-10; 2 unsigned char ch1=5; 3 if(ch-ch1>0) 4 printf("ch-ch1>0\n"); 5 if(ch-ch1<0) 6 printf("ch-ch1<0\n");
这里就出现疑惑了,不是应该提升成为无符号的吗?那么ch应该减去5应该还是大于0的呀?
其实,是因为char会被提升成int,这里无符号char和有符号的都被提升成int了,所以输出是这样。
那么,到底应该如何分辨呢?
NOTE:
类型提升负责把小整数转化成大整数类型。对于bool,char,signed cahr,unsigned char,short,unsigned short等类型,只要他们的值都可能存在int中,他们就会提升成int,否则提升成unsigned int 类型。布尔值 false提升成0,true提升成1.
在运算的时候,类型一定是相同的,如果不同,就会有隐式或者显式的类型转换。
而首先进行的是类型提升。
这里有一段很长的话出自c++ primer,就不列出了,但我把那一段话概括了一下。
summary:
运算对象的类型在做运算时会被提升成一样的类型,不管之前类型是否相同,这种提升向着类型的模更大的转化。
eg:
ch 和ch1为char和uchar,在运算时首先提升为int,都是int类型比较就不存在类型提升问题,数学是如何计算机就如何计算;
ch和ch1为int和uint,在运算时已经是整形,但存在无符号和有符号之分,所以类型提升为无符号(模更大)。
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并获取更多隐藏干货,QQ交流群:816747642 微信公众号:Crystal软件学堂
作者:Crystal软件学堂 bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |