C中有符号字符的增量操作行为

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+

对于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+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)会起作用,因为
字符
会被提升回
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;
}