【C语言】表达式求值中的类型转换问题

   表达式求值中的类型转换问题

  隐式类型转换

  表达式求值是程序中常见的一类问题,通常来讲只要知道各种运算符及其运算规则,表达式求值都是比较简单的。但是,有时候结果并非我们所期待的。首先来看一段程序:

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;

此处进行了隐式类型转换,会存在精度丢失。

猜你喜欢

转载自blog.csdn.net/Sunshine_R9H15Chen/article/details/79507981