整体提升和平衡有什么区别?我们能不能总结一下这两种规则:在执行任何操作之前,任何类型都被转换为至少int或无符号int类型(除了逻辑运算符&,\> !)如果任何操作数的类型大于int,则将其改为更大的类型?
发布于 2012-08-23 15:00:12
标准中有两种不同的东西,但没有一种叫做平衡:
如果
int可以表示原始类型的所有值(受宽度限制,用于位字段),则将该值转换为int;否则,该值将转换为unsigned int。这些被称为整数提升。58)所有其他类型都不受整数提升的影响。
……
6.3.1.8通常的算术转换许多期望算术类型操作数的操作符会以类似的方式导致转换和产生结果类型。其目的是为操作数和结果确定一个公共的实类型。
应用于不同类型表达式的运算符的一般思想是,操作数被转换为精度损失较小的类型。例如,如果a是float而b是双倍,则在加法之前将和a + b a转换为double。类似地,如果c是unsigned long,则首先将c + b转换为double。
发布于 2012-08-27 07:00:25
“积分促销”是旧的C90术语,正式的标准术语是整数促销。
整数提升是一种规则,每当在表达式中使用小整数类型(bool、char、short和它们的等效符号)作为操作数时都适用。
C11 6.3.1.1/4
如果int可以表示原始类型的所有值(受宽度限制,用于位字段),则将该值转换为int;否则,将其转换为无符号int。这就是所谓的整数晋升。所有其他类型都不受整数提升的影响。
“平衡”是一种非正式术语,指的是一套称为通常算术转换的规则。它们说明如何完成操作中每个操作数的所有隐式类型提升。请注意,整数提升是通常算术转换的一部分:
C11 6.3.1.8
首先,如果任何一个操作数的对应实类型是长双,则另一个操作数被转换成相应的实类型为长双的类型,而不改变类型域。 否则,如果任何一个操作数的对应实类型为double,则另一个操作数将在不改变类型域的情况下转换为相应的实类型为double的类型。 否则,如果任何一个操作数的对应实类型为float,则另一个操作数将转换为相应的实类型为float的类型,而不改变类型域。 否则,整数提升将在两个操作数上执行。然后将下列规则应用于提升操作数: 如果两个操作数都具有相同的类型,则不需要进一步的转换。 否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换秩类型的操作数将转换为级别较大的操作数类型。 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则带符号整数类型的操作数转换为无符号整数类型的操作数类型。 否则,如果带符号整数类型的操作数的类型可以用无符号整数类型表示操作数类型的所有值,则具有无符号整数类型的操作数转换为带符号整数类型的操作数类型。 否则,两个操作数都转换为与带符号整数类型的操作数类型对应的无符号整数类型。
https://stackoverflow.com/questions/12094412
复制相似问题