K&R C中定义整型提升:
1. 只要一个表达式中用到了整型值,那么类型为char、short int活整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象,都可以被放在这个整型变量的位置。
2. 如果1)中的变量的原始类型值域可以被int表示,那么原值被转换为int;否则的话,转为unsigned int。
这段话理解起来是不是有点困难,我们来举个例子理解起来就简单了
char a = '2';
char b = '4';
char c = a + b;
printf("%c\n",c);
在上述过程中,尽管两个运算符”+”和”=”的操作数全为char型,但在中间计算过程中存在着整数提升:对于表达式a+b ,a、b都是char型,因此被提升至int型后,执行“+”运算,计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换。
是不是觉得很不可思议。
其实可以通过一种方式来验证它:
printf(“%d”, sizeof(a + b));
大家猜猜输出的值是多少?1,对吗?很遗憾,不是1,大小是4
这是为什么呢,显然a+b进行了整型提升,而没有来得及将int型的值赋值给c(char型),所以大小就成了4。
ANSI C规定,编译器如果能保证保证运算结果一致,也可以省略类型提升的操作——这通常出现在表达式中存在常量操作数的时候。