C编程中的整数提升

Integer promotions in C programming

在下面的代码中,哪些语句具有整数提升?

unchar a;
unchar b;
short c;
a = 0xFE;
b = 0xFE;
c = a+b;
int d = a==b

我在一个问题系列中得到了这样的问题。怎么回答。

此外,一些数据类型如 char 、 short int 占用的字节数少于 int ,这些数据类型在对它们执行操作时会自动提升为 int 或 unsigned int 。这称为整数提升。例如,没有算术计算发生在较小的类型上,如 char、short 和 enum。

which statements have integer promotions.

unchar a;
unchar b;
short c;

这些似乎是声明,可能 uncharunsigned char 的别名。其中没有表达式,所以没有整数提升。

a = 0xFE;

0xFE 是一个无后缀的十六进制常量,其值 254 必须适合 int。根据 C 2018 6.4.4.1 5,其类型为 inta 是一个左值。作为赋值的左操作数,它作为左值保留,不转换为值。

根据 C 2018 6.5.16 2,右操作数被转换为左操作数在左值转换后的类型,因此 unsigned char。不执行整数提升。

b = 0xFE;

这个和上面一样

c = a+b;

对于算术操作数上的二进制 + 运算符,按照 c 2018 6.5.6 5 执行通常的算术转换。对于整数运算,通常的算术转换包括整数提升。因此整数提升是在 ab.

上执行的

除了在深奥的 C 实现中,int 可以表示 unsigned char 的所有值。在这种情况下,整数提升将 unsigned char 转换为 int。所以他们将每个 ab 转换为 int.

然后 + 产生一个 int 结果,并且,由于它是赋值的右操作数,它被转换为 c 在左值转换后的类型,short。没有进一步的整数促销。

int d = a==b

这与上面类似。对于 == 的算术操作数,按照 C 2018 6.5.9 4 执行通常的算术转换。这些包括 ab 上的整数提升。此中没有其他整数促销。