【问题标题】:Why turbo c wraparound signed integer overflow every time though signed integer overflow is undefined?为什么 turbo c wraparound 有符号整数溢出每次虽然有符号整数溢出是未定义的?
【发布时间】:2017-05-13 19:40:02
【问题描述】:

我已经多次进行签名溢出,但每次都使用 turbo c 环绕。 例如:

#include <stdio.h>

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

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

【问题讨论】:

  • 看看this。它很好地解释了未定义的行为,并专门讨论了未定义的行为以及我们有时使用夸张来描述它的方式。

标签: c++ c int turbo-c


【解决方案1】:

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

(假设 INT_MAX 小于 100000。)

任务:

int i=100000;

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多