为什么这个sizeof(c + a)给出4个字节而不是3个字节

Ami*_*hak 2 c int sizeof short char

#include <stdio.h>
int main()
{
   short int a;
   char c;
   printf("%d %d %d",sizeof(a),sizeof(c),sizeof(c+a));
}
Run Code Online (Sandbox Code Playgroud)

在这个sizeof a中,2字节大小的char是1字节但是我把它们加起来它给4字节.它在表达式中做了什么使其成为4

And*_*nle 11

在a short int中添加一个char结果int,显然是系统上的4个字节.

这是"整数提升"的情况.请参阅在C表达式中,其中存在unsigned int和signed int,哪种类型将被提升为什么类型?作出解释.规则相当混乱,但那里的答案解释得相当好.

6.3.1.8常见的算术转换C标准,实际的转换规则为:

如果两个操作数具有相同的类型,则不需要进一步转换.

否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型.

否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.

否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型.

否则,两个操作数都转换为无符号
整数类型,对应于带有符号整数类型的操作数的类型.

结果是4,因为@WeatherVane在评论中指出:

5.1.2.3第11段示例2 在执行片段时 char c1, c2; /* ... */ c1 = c1 + c2; ,"整数提升"要求抽象机器将每个变量的值提升为int大小,然后添加两个整数并截断总和.但是这里没有截断,因为目的地是未知的.

  • 5.1.2.3第11段例2在执行片段`char c1,c2;/*...*/c1 = c1 + c2;`*"整数提升"要求抽象机器将每个变量的值提升为int大小,然后添加两个整数并截断总和.*但是没有这里截断,因为目的地是未知的. (3认同)
  • @ChristianGibbons`a + c`尚未分配给任何目标变量.算术计算被提升为`int`. (2认同)