C中有符号字符的增量操作行为
对于C中的有符号字符,范围为-128到127。C中有符号字符的增量操作行为,c,C,对于C中的有符号字符,范围为-128到127。a+1(如代码中所示)如何生成128而不是-128?随后的增量为正常值(a和i均为-127) #包括 int main() { 字符i=127,a=127; printf(“%d\n”,++i);//输出为-128 printf(“%d\n”,a+1);//输出为128 //对于a和i,在此之后的后续增量为-127。 返回0; } 当与算术运算符一起使用时,所有小整数类型(bool,char,short)在对其执行任何算术之前都会进行整数升级。在a+
a+1
(如代码中所示)如何生成128而不是-128?随后的增量为正常值(a
和i
均为-127)
#包括
int main()
{
字符i=127,a=127;
printf(“%d\n”,++i);//输出为-128
printf(“%d\n”,a+1);//输出为128
//对于a和i,在此之后的后续增量为-127。
返回0;
}
当与算术运算符一起使用时,所有小整数类型(bool
,char
,short
)在对其执行任何算术之前都会进行整数升级。在a+1
表达式中,您的a
被提升为int
,这意味着此表达式实际上被解释为(int)a+1
。char
的范围在这里不起作用。所有计算均在int
域中执行,结果为int
类型127+1
是128
,这是您看到的打印内容
您的
++i
定义为i=i+1
。出于同样的原因,右侧被计算为(int)i+1
,这意味着在这种情况下,加法也在int
域中执行。之后,结果被转换回char
,并存储回i
。添加本身不会溢出并产生128
,但随后转换回char
“溢出”,从而产生实现定义的行为。在您的例子中,实现定义的行为将-128
的值生成为char
结果。1
是int
,因此a+1
是int
作为int
传递的。a+1
的结果在任何时候都不会分配给char
@Weather vane请参见@AnT.Yes.noted@weathervane的答案作为旁注,char
不一定要签名。仅为完整起见,printf中的%d
格式(“%d\n”、++i)然后,code>会起作用,因为字符
会被提升回int
,作为可变参数规则中的默认提升@蚂蚁,引用你所说的,我对(a+1)有疑问。“所有的计算都是在int域中进行的,结果是int类型的。127+1是128,这就是你所看到的打印结果。”我确信这一点;但是考虑下一个增量A=128(A+ 1)。输出打印为-127;不是129,正如你认为应该发生的。答:Shivani:这一开始就失败了。代码>a=128
已超出实现定义行为的范围。在您的实现中,a=128
相当于a=-128
。只有在这之后,a+1
才会按照我上面所述进行计算,并预期产生-127
结果。
#include<stdio.h>
int main()
{
char i=127,a=127;
printf("%d\n",++i);//output is -128
printf("%d\n",a+1);//output is 128
//subsequent increment after this is -127 for a and i.
return 0;
}