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

Pan*_*ato 2 c sizeof

#include <stdio.h>

int main()
{
    short int i = 20;
    char c = 97;
    printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码的输出是

2, 1, 4
Run Code Online (Sandbox Code Playgroud)

根据我应该是

2, 1, 2
Run Code Online (Sandbox Code Playgroud)

因为char + short intshort int和大小的short int2.

her*_*tao 6

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

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

在此输入图像描述

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

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

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

  • 另见[在线C2011标准](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf),第6.3.1.1节,第2节和脚注58. (2认同)