在添加和计算时,sizeof如何适用于不同的数据类型?

#include  int main() { short int i = 20; char c = 97; printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i)); return 0; } 

这段代码的输出是

 2, 1, 4 

根据我应该是

 2, 1, 2 

因为char + short intshort intshort int大小是2

根据C标准积分推广规则 ,表达式c + i的类型将为int ,这就是为什么你得到的等价于sizeof (int) ,即4

当在某些类型的表达式中使用不同的算术类型作为操作数时,将应用称为通常算术转换的标准转换。 根据算术类型的等级应用这些转换:具有较低等级类型的操作数被转换为具有较高等级的操作数的类型。 这称为积分或浮点促销。

在此处输入图像描述

除此之外,根据这里 ,算术运算符不接受小于int类型作为参数,并且自动应用整体促销。 所以即使sizeof(c+c)你也会得到4

您可以从本国际标准 – 编程语言 – C,第6.3.1.1节,第2条中找到以下信息:

[…]如果intcan表示原始类型的所有值(由宽度限制,对于位字段),该值将转换为int; 否则,它将转换为unsigned int。 这些被称为整数促销。 整数提升仅适用于:通常算术转换的一部分,某些参数表达式,一元+, – 和〜运算符的操作数,以及移位运算符的两个操作数,由各自的子条款指定。 )[…]