设为首页 加入收藏

TOP

14.3.2 Usual Arithmetic Conversion
2013-10-12 06:51:58 来源: 作者: 【 】 浏览:74
Tags:14.3.2 Usual Arithmetic Conversion

14.3.2  Usual Arithmetic Conversion

两个算术类型的操作数做算术运算,比如a + b,如果两边操作数的类型不同,编译器会自动做类型转换,使两边类型相同之后再做运算,这称为Usual Arithmetic Conversion。转换规则如下:

1.如果有一边的类型是long double,则把另一边也转成long double。

2.如果有一边的类型是double,则把另一边也转成double。

3.如果有一边的类型是float,则把另一边也转成float。

4.两边都是整型,首先按第14.3.1节讲过的规则对a和b做Integer Promotion,如果类型仍不相同,则需要继续转换。我们规定char、short、int、long、long long的转换级别(Integer Conversion Rank)一个比一个高,同一类型的有符号和无符号数具有相同的Rank。转换规则如下:

如果两边都是有符号数,或者都是无符号数,那么较低Rank的类型转换成较高Rank的类型。例如unsigned int和unsigned long做算术运算时都转成unsigned long。

如果一边是无符号数另一边是有符号数,无符号数的Rank不低于有符号数的Rank,则把有符号数转成另一边的无符号类型。例如unsigned long和int做算术运算时都转成unsigned long,unsigned long和long做算术运算时也都转成unsigned long。

剩下的情况是:一边有符号另一边无符号,并且无符号数的Rank低于有符号数的Rank。这时又分为两种情况,如果有符号数类型能够覆盖无符号数类型的取值范围,则把无符号数转成另一边的有符号类型。例如在遵循LP64的平台上unsigned int和long做算术运算时都转成long。

否则,也就是这个有符号数类型不足以覆盖这个无符号数类型的取值范围,则把两边都转成有符号数的Rank对应的无符号类型。例如在遵循ILP32的平台上unsigned int和long做算术运算时都转成unsigned long。

可见有符号和无符号整数的转换规则是十分复杂的,虽然这是有明确规定的,不属于阴暗角落,但为了程序的可读性不应该依赖这些规则来编写代码。我讲这些规则,不是为了让你用,而是为了让你了解有符号数和无符号数混用会非常麻烦,从而避免触及这些规则,并且在程序出错时记得从这上面找原因。所以这些规则不需要牢记,但要知道有这么回事,以便在用到的时候能找到本书的这一段。

到目前为止我们学过的+ - * / % > < >= <= == !=运算符都需要做Usual Arithmetic Conversion,因为都要求两边操作数的类型一致,在下一章会介绍几种新的运算符也需要做Usual Arithmetic Conversion。单目运算符+ - ~只有一个操作数,移位运算符<< >>两边的操作数类型不要求一致,这些运算不需要做Usual Arithmetic Conversion,但需要做Integer Promotion,运算符~ << >>将在下一章介绍。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇6.1 while语句 下一篇6.4 break和continue语句

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: