[英]Confusion about sizeof operator in C
我对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。 为什么会这样?
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
可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int
; 否则,它将转换为unsigned int
。 这些被称为整数促销 。
因此, sizeof(num1+num2)
与sizeof(int)
相同。
result
是char
类型,因此sizeof
为1
而num1+num2
提升为int
类型,因此它给出4
( int
大小)。
请注意,当对小于int
的类型执行算术运算时,所有值的值都可以用int
表示,那么result将被提升为int
类型。
num1 + num2变为整数,因此输出为4,而result为char,输出1。
你可以参考这篇文章整数推广 :
如果int可以表示原始类型的所有值,则该值将转换为int; 否则,它将转换为unsigned int。 这些被称为整数促销。 整数促销不会更改所有其他类型。
一个char的大小是1byte,char可以保存最多127个值(无符号最多255个)。 当你说(a + b)之类的东西时,会创建一个临时变量并用于向b添加a,因为a和b只能容纳127,所以编译器将它们提升为int,只是为了确定。
这是合乎逻辑的,因为如果a = 100且b = 100,用户希望在添加它们时看到200而不是73(这是溢出的结果)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.