C语言 当运行无限循环时,为什么int或char在最后给出负值


#include <stdio.h>
int main()
{
signed char x = 0;
for (; x >= 0; x++);
printf("%dn", x);
return 0;
}

这段代码的输出是-128。有人能解释一下原因吗?

实现定义的行为

signed char x = 0; for (; x >= 0; x++);从0迭代x到127 (SCHAR_MAX),目前为止一切正常。

在下一次迭代中,x++x = x + 1;一样,尝试将128赋值给signed char x。因为这超出了signed char范围:

否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么引发实现定义的信号。
(有关转换为有符号类型的C规范)

一个常见的实现定义的结果是绕到-128或SCHAR_MIN。其他结果也可能发生,比如将最大值赋值为127,导致不定式循环。

没有有符号整数溢出,只是一个超出范围的赋值。


代码的可移植性不高,应该避免使用。

这是实现定义的行为。

在x86平台上,所有编译器都知道,当x是127,你加上1,它执行无符号加法,结果是0b10000000,在两个补码的有符号整数格式是-128

由于x-128,循环终止,输出-128

最新更新