#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