C语言之表达式运算整体提升

整型提升是C语言的一种规则,由C语言的发明人丹尼斯·里奇与肯·汤普逊创设:

"A character, a short integer, or an integer bit-field, 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内整型操作数的标准长度。通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

 同样的,还有浮点类型提升:

当表达式中最长的是long double类型,则其他类型提升为long double类型再进行运算;当最长类型为double则其他类型提升至double类型;当最长类型为float则其他类型提升至float类型。整型全部转换为对应浮点类型。

 

对于一个表达式,根据K&R中描述的具体转换规则如下:

① 首先,如果参与运算的任何一个操作数为 long double 类型,则将另一个操作数转换为 long double 类型。

② 否则,如果任何一个操作数为 double 类型,则将另一个操作数转换为 double 类型。

③ 否则,如果任何一个操作数为 float 类型,则将另一个操作数转换为 float 类型。

④ 否则,同时对两个操作数进行整型提升。

⑤ 然后,如果任何一个操作数为 unsigned long int 类型,则将另一个操作数转换为 unsigned long int 类型。

⑥ 否则,如果一个操作数为 long int 另一个为 unsigned int 类型,则结果依赖于 long int 类型能否表示所有的 unsigned int 类型;如果可以则将 unsigned int 类型转换 long int (64位系统下 long 是8byte,可以表示 unsigned int ,但是32位环境不可以表示)。如果不可以,则将两个数都转为 unsigned long int 类型。

⑦ 否则,如果任何一个操作数为 long int 类型,则将另一个操作数转换为 long int 类型。

⑧ 否则,如果任何一个操作数为 unsigned int 类型,则将另一个操作数转换为 unsigned int 类型。

⑨ 否则,将两个操作数都转换为 int 类型。

posted @ 2021-01-05 17:17  Lunais  阅读(208)  评论(0编辑  收藏  举报