7.4.4强制类型转换

 

虽然C语言的隐式转换使用起来非常方便,但我们有些时候还需要从更大程度上控制类型转换。基于这种原因,C语言提供了强制类型转换。强制类型转换表达式的格式如下:

【强制转换表达式】(类型名)表达式

这里的类型名表示的是表达式应该转换成类型。

下面的例子显示了使用强制类型转换表达式计算float类型值小数部分的方法:

float f, frac_part:

frac_part = f - (int) f;

强制类型转换表达式(int)f 表示把 f 的值转换成int类型的结果。C语言的常用算术转换则要求在进行减法运算前把(int)f 转换回 float 类型。 f 和(int) f 的不同之处就在于 f 的小数部分, 这部分在强制类型转换时被丢掉了。

强制类型转换表达式可以用于显示那些肯定会发生的类型转换:

i = (int) f ;

它也可以用来控制编译器并且强制它进行我们需要的转换。思考下面的例子:

flaot quotient;

int dividend, divisor;

quotient = dividend / divisor;

正如现在写的那样,除法的结果是一个整数,在把结果存储在quotient 的变量中之前,要把结果存储在quotient变量中之前,要把结果转换成float格式。但是,为了得到更精确的结果,可能需要再除法执行之前把dividend和divisor的类型转换成float格式的。强制类型转换表达式可以完成这一点:

quotient = (float) dividend / divisor;

变量divisor不需要进行强制类型转换,因为把变量dividend强制转换成flaot类型会迫使编译器把divisor也转换成float类型。

顺便提一下,C语言把(类型名)视为一元运算符。 一元运算符的优先级高级二元运算符,所以编译器会把表达式

(float) dividend / divisor

解释为

((float) dividend) / divisor

如果感觉有点混淆,那么注意还有其他方法可以实现同样的效果:

quotient = dividend / (float) divisor;

或者

quotient = (float) dividend / (float) divisor;

有些时候,需要使用强制类型转换来避免溢出。思考下面例子;

long i; int j = 1000; i = j * j; /*overfloaw may occur*/

乍看之下,这条语句没有问题。表达式j * j 的值是1000000, 并且变量 i 是long int类型的,所以 i 应该能很容易地存储这种大小的值,不是吗?问题是,当两个int类型值相乘时,结果也应该是int 类型的,但是j * j 的结果太大,以致在某些机器上无法表示成int 型,从而导致溢出。幸运的是,可以使用强制类型转换避免这种问题的发生:   i = (long)j * j;

因为强制运算符的优先级高于*,所以第一个变量j 会被转换成long int 类型,同时也迫使第二个j 进行转换。注意,语句   i=(long)(j*j);

是不对的,因为溢出在强制类型转换之前就已经发生了。

 
上一篇:HTML5-基础-标签


下一篇:Medium | LeetCode 166. 分数到小数 | 数学