整型提升 整型提升是C程序设计语言中的一项规定在表达式计算时各种整形首先要提升为int类型如果int类型不足以表示则要提升为unsigned int类型然后执行表达式的运算 这一规则是由C语言的发明人丹尼斯里奇与肯汤普逊创设的 A character a short integer or an integer bitfield all either signed or not or an object of enumeration type may be used in an expression wherever an integer maybe used If an int can represent all the values of the original type then the value is converted to int otherwise the value is converted to unsigned int This process is called integral promotion 这段话的大意是表达式中可以使用整数的地方就可以使用枚举类型或有符号或无符号的字符短整数整数位域如果一个int可以表示上述类型则该值被转化为int类型的值否则该值被转化为unsigned int类型的值这一过程被称作integral promotion 整型提升的意义在于表达式的整型运算要在CPU的相应运算器件内执行CPU内整型运算器ALU的操作数的字节长度一般就是int的字节长度同时也是CPU的通用寄存器的长度因此即使两个char类型的相加在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度通用CPUgeneralpurpose CPU是难以直接实现两个比特字节直接相加运算虽然机器指令中可能有这种字节相加指令所以表达式中各种长度可能小于int长度的整型值都必须先转换为int或unsigned int然后才能送入CPU去执行运算 C语言标准中仅规定了 char的长度  short int的长度  int的长度 这意味着short int与int的长度相等的可能这种情形下unsigned short就无法提升为int表示只能提升为unsigned int 示例程序如下 include stdioh int main  char a  xb short b  xb int c  xb if  a  xb printfa if  b  xb printfb if  c  xb printfc  在x架构上的Visual C或gcc编译下上述程序输出为 c 这是因为在这些环境下编译器把char定义为signed charC语言标准没有规定char类型是有符号还是无符号表达式axb被整型提升其中char类型的a提升为int类型并为一个负值因此这个表达式的结果为false表达式bxb被整型提升其中short类型的b提升为int类型并为一个负值因此这个表达式的结果为false表达式c  xb没有做整型提升运算符的两段都是int类型的负值其结果为true C语言的单操作数的运算符即前缀一个主要作用就是实现对操作数的整型提升例如 include stdioh int main  char a   printfu sizeofa  printfn printfu sizeof a    在x的位gcc编译后输出为