关于C中sizeof运算符的困惑

时间:2016-07-14 07:45:07

标签: c sizeof addition integer-promotion

我对C中的sizeof运算符感到困惑。

#include <stdio.h>

int main(void)
{
    char num1=1, num2=2, result;
    result = num1 + num2;
    printf("Size of result: %d \n",sizeof result);
    printf("Size of result: %d \n",sizeof(num1+num2));
}

结果分别为1和4。为什么会这样?

4 个答案:

答案 0 :(得分:5)

TL; DR回答:

  • sizeof resultsizeof(char)相同。
  • sizeof(num1+ num2)sizeof (int) 为何相同?

在您的情况下,它们分别产生1(标准保证)和4(可能变化)。

sizeof生成size_t类型的结果,因此您应该%zu格式说明符来打印该值。

<强>为什么:

首先,对于加法运算符+,引用C11,章节§6.5.6

  

如果两个操作数都具有算术类型,则执行通常的算术转换   它们。

关于通常的算术转换,§6.3.1.8/ p1

  

[....]否则,对两个操作数执行整数提升。[...]

然后来自§6.3.1.1,/ p2,

  

如果int可以表示原始类型的所有值(由宽度限制,对于a   位字段),该值转换为int;否则,它将转换为unsigned int。这些被称为整数促销

因此,sizeof(num1+num2)sizeof(int)相同。

答案 1 :(得分:4)

result属于char类型,因此sizeof提供1num1+num2提升为int类型,因此它会4 1}}(int的大小。)

请注意,当对小于int的类型执行算术运算时,所有值都可以由int表示,则结果将提升为int类型。

答案 2 :(得分:3)

num1 + num2变为整数,因此输出为4,而结果为char,输出1。

您可以参考此文章Integer Promotion

  

如果int可以表示原始类型的所有值,则值为   转换为int;否则,它将转换为unsigned int。   这些被称为整数促销。所有其他类型都保持不变   通过整数促销。

答案 3 :(得分:0)

一个char的大小是1byte,char可以保存最多127个值(无符号最多255个)。 当你说(a + b)之类的东西时,会创建一个临时变量并用于向b添加a,因为a和b只能容纳127,所以编译器将它们提升为int,只是为了确定。

这是合乎逻辑的,因为如果a = 100且b = 100,用户希望在添加它们时看到200而不是73(这是溢出的结果)。