我对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。为什么会这样?
答案 0 :(得分:5)
TL; DR回答:
sizeof result
与sizeof(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
提供1
而num1+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(这是溢出的结果)。