整型提升就是char、short int和位段类型(无论signed或unsigned)以及枚举类型将被提升为int,前提是int 能够完整地容纳原先的数据,否则将被转换为unsigned int。
ANSI C表示,如果编译器能够保证运算结果一致,也可以省略类型提升——这通常出现在表达式中存在常量操作数的时候。
另一个会发生隐式类型转换的地方就是参数传递。
在K&R C中,由于函数的参数也是表达式,所以也会发生类型提升;在ANSI C中,如果使用了适当的函数原型,类型提升便不会发生,否则也会发生。
在被调用函数的内部,提升后的参数被裁减为原先声明的大小。
这就是为什么单个的printf()格式字符串%d能适用于几个不同类型,short、char或int,而不论实际传递的是上述类型的哪一个。
函数从堆栈中(或寄存器中)取出的参数总是int类,并在printf或其他被调用函数里按统一的格式处理。
printf是一个可变参数函数,此时一般的参数提升始终会发生。
责任编辑:小草