运算时的数据类型提升

今天来分析测试一下这个很多人迷糊的地方,因为有些老师在这个地方讲得有待商榷。

一种常见说法是:无符号和有符号数进行运算时,类型被提升为无符号类型。

这也是我当初听老师讲课时的说法。

test1:

1     signed int ch=-10;
2     unsigned int ch1=5;
3     if(ch-ch1>0)
4         printf("ch-ch1>0
");
5     if(ch-ch1<0)
6         printf("ch-ch1<0
");

ch类型提升为unsigned int,-10的二进制补码是个很大的正整数,减去5大于0,所以输出

 printf("ch-ch1>0
");
这里并没有什么特殊,但是,随着代码量的累计,我们发现了另外一个问题:
test2:
1     signed char ch=-10;
2     unsigned char ch1=5;
3     if(ch-ch1>0)
4         printf("ch-ch1>0
");
5     if(ch-ch1<0)
6         printf("ch-ch1<0
");

 这里就出现疑惑了,不是应该提升成为无符号的吗?那么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,在运算时已经是整形,但存在无符号和有符号之分,所以类型提升为无符号(模更大)。

原文地址:https://www.cnblogs.com/yangguang-it/p/6367671.html