类型转换

  语句和表达式通常应该只是用一种类型的变量和常量。如果混合使用类型,C会使用一个规则集合来自动完成类型转换。这可能很方便,但也很危险。类型转换的基本规则如下:

1、当出现在表达式里时,有符号和无符号的char和short类型都将自动被转换为int,在需要的情况下,将自动被转换为unsigned int(如果short与int有相同的大小,那么unsigned short比int大;在那种情况下,将把unsigned short转换为unsigned int)。

2、在包含两种类型的任何运算力,两个值都将被转换成两种类型里较高的级别。

3、类型级别从高到低的顺序是long double、double、float、unsigned long long、long long、unsigned long、long、unsigned int 和int。一个可能的例外是当long和int具有相同大小时,此时unsigned int 比long的级别更高。之所以short和char类型没有出现在此清单里,是因为它们已经被提升到了int或也能被提升到unsigned int。

4、在赋值语句中,计算的最后结果被转换成将要被赋予值得那个变量的类型。这个过程可能导致提升(promotion),也可能导致降级(demotion)。

5、当作为函数的参数被传递时,char和short会被转换成int,float会被转换为double。可以通过函数原型来阻止自动提升的发生。

 

  提升通常是一个平滑的无损害的过程,但是降级可能导致真正的问题。原因很简单:一个较低级别的类型可能不够大,不能存放一个完整的数。一个8字节的char可以存放整数101,但是不能存放整数22334.当把浮点类型降级为整数类型时,它们被趋零截尾或舍入。这意味着23.12和23.99都被结尾成23,-23.5被截尾成-23.

posted on 2016-03-30 16:18  段朋成  阅读(179)  评论(0编辑  收藏  举报

导航