表达式求值中的类型转换问题
隐式类型转换
表达式求值是程序中常见的一类问题,通常来讲只要知道各种运算符及其运算规则,表达式求值都是比较简单的。但是,有时候结果并非我们所期待的。首先来看一段程序:
int main()
{
char c1 = 12;
char c2 = 118;
char c3 = c1 + c2;
printf("c3=%d\n",c3);
return 0;
}
对于初学者来讲,130是上述程序的正确输出。然而,正确结果为:-126.
这里就遇到了类型转换中的“整型提升”:C语言中的整型算术运算总是以至少缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型。整型提升是一种隐式类型转换。对上述程序进行分析,如下图:
再举个例子:a=(~a^b<<1)>>1;该表达式中要对b的bit位进行左移一位,此时如果我们把b提升成整型,即使左移了一位(“丢掉了”左边最高位),该位也并未丢失,仍存在其二进制位中。
算术转换
如果一个运算符的两侧的数据类型不同,则先自动进行类型转换,使二者具有同一种类型,然后进行运算。因此,整型、实型、字符型数据间可以进行混合运算。
寻常算术体系:
如果某个操作数的类型在上面这个列表中排名较低,那么首先要隐式地转换为另外一个操作数的类型后再执行运算。
注意:要进行合理的算术转换,否则会存在潜在问题。如:
float f = 3.14;
int num = f;
此处进行了隐式类型转换,会存在精度丢失。