【发布时间】:2021-10-28 18:19:55
【问题描述】:
#include <stdio.h>
int main()
{
signed char x = 0;
for (; x >= 0; x++);
printf("%d\n", x);
return 0;
}
这段代码的输出是-128。谁能解释一下为什么?
【问题讨论】:
-
"...当有符号整数算术运算溢出时(结果不适合结果类型),行为未定义,——可能的表现形式这样的操作包括:..." 见-en.cppreference.com/w/cpp/language/…
-
@Jarod42:这里没有未定义的溢出。行为是实现定义的,而不是未定义的。根据 C 2018 6.5.2.4,
x++的行为类似于x += 1。根据 6.5.16.2,x += 1的行为类似于x = x+1,除了左值x仅计算一次。根据 6.5.16.1,x = x+1将右侧转换为左侧的类型。根据 6.3.1.3 3,当右侧无法以新类型表示时(例如,当右侧为 128 时,左侧是 8 位二进制补码signed char),结果要么是实现定义的,要么是引发了实现定义的信号。 -
@molbdnilo:这里没有未定义的行为。见上面的 cmets 和chux’ answer。
-
@RichardCritten:在C++中,和在C中一样,操作数被提升为
int,加法中没有溢出,总和转换为signed char,结果是实现-已定义。 -
@Jarod42:C 标准要求实现定义转换的行为,这必须是返回实现定义的值或引发实现定义的信号。实现可能未定义转换的行为以导致循环成为无限循环。 C++在这方面也是一样的。
标签: c data-structures char integer