整形提升

关于两个数比较,经常会有整形提升的问题,这里整理总结一下这类问题。

* 首先,看个例子

int a = -1;
    unsigned int b = 2;
    signed short c = -1;
    unsigned short d = 2;
    Compare_value(a,b);
    Compare_value(a,d);
    Compare_value(c,d);


************************************************
结果为:
//a>b   a,b是int
//a<d
//c<d   c,d是short
************************************************
你会惊讶为什么同为-1,2的两个数,在分别为int型和short型时的比较结果不一样呢?

* 转换

C99标准中算数运算中有两种转换,一个是整形提升(integer promotion),另外一个是普通算术转换(usual arithmetic conversions)。

** 整形提升

 1). 只要一个表达式中用到了整型值,那么类型为char、short、 整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象,都可以被放在这个整型变量的位置。
 2). 如果1)中的变量的原始类型值域可以被int表示,那么原值被转换为int;否则的话,转为unsigned int。

** 普通算术转换

1. 如果两个操作数具有相同的类型,那么不需要任何的转换;
2. 否则,如果两个操作数同为有符号或者同为无符号,则rank小的操作数需要被提升为rank大的操作数的类型;
3. 否则,一个无符号操作数的rank大于或者等于另外一个有符号操作数,则该有符号操作数的类型会提升为无符号操作数的类型;
4. 否则,一个有符号操作数可以表示另一个无符号数的所有的值,那么那个无符号操作数的类型需转换为该有符号类型;
5. 否则,两个操作数都需要转换为有符号数对应的无符号类型。//貌似上面几种已经把所有可能列完了,这条不清楚。
说明:普通算术转换是发生在操作数类型不一致的情况下,而即使操作数的类型相同,仍有可能会发生整型提升。

下面的结果就可以说明操作数类型相同,仍然可能会整形提升:
char a,b;
sizeof(a+b);//4

* 总结

回头看一开始的例子:
a,b比较时,根据普通算术转换第三条,将int转换为unsigned int,此时a>b
a,d比较时,根据普通算术转换第四条,d发生提升
c,d比较时,根据整形提升(不是普通算术转换),c,d都提升为int型。


参考:

http://blog.csdn.net/lovekatherine/article/details/1565969

http://blog.chinaunix.net/uid-23629988-id-2938697.html

转载于:https://my.oschina.net/hebianxizao/blog/76470

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值