为什么 turbo c wraparound signed integer overflow 每次虽然有符号整数溢出是未定义的?

Why turbo c wraparound signed integer overflow every time though signed integer overflow is undefined?

我多次使签名溢出,但每次都是 turbo c 回绕。 例如:

#include <stdio.h>

void main() {
  int i = 100000; 
  printf("%d", i);
  getch();
}

输出是 -31072,这是完成回绕后的预期输出。 在二进制中 100000(dec)11000011010100000 并且最后 16 位是存储的 是 1000011010100000。在两个补码表示中 1000011010100000-31072.

您的示例不包含任何带符号的溢出,因此不存在未定义的行为。

(假设 INT_MAX 小于 100000。)

作业:

int i=100000;

执行从 long 类型(整数常量 100000 的类型)到 int 类型的隐式转换。这个转换结果是实现定义的1(或者实现定义的陷阱是信号)。


1(引自:ISO/IEC 9899:201x 6.3.1.3 有符号和无符号整数 3)
否则,新类型被签名并且不能在其中表示值;无论是 结果是实现定义的或引发了实现定义的信号。