代码之家  ›  专栏  ›  技术社区  ›  ruslik

整数溢出和未定义的行为

c
  •  14
  • ruslik  · 技术社区  · 15 年前

    undefined behavior . 所以,我的问题是

    为什么会产生这个 未定义的行为 首先呢?

    1) 在这种情况下生成异常的处理器。当然,它可以被关闭,而且很可能一个写得很好的CRT可以做到这一点。

    2) 使用其它二进制数字表示法(1的补码)的处理器?基数10?)。在这种情况下,未定义的行为将以不同的结果出现(但不会崩溃!)。好吧,我们可以接受。

    那么,为什么要有人避免引起呢?我遗漏了什么吗?

    4 回复  |  直到 15 年前
        1
  •  11
  •   Paul R    15 年前

    尽管 现代CPU使用2的补码,整数溢出导致可预测的模环绕,这绝不是通用的-为了使语言足够通用,以便在最广泛的架构上使用它,最好指定整数溢出是UB。

        2
  •  12
  •   R.. GitHub STOP HELPING ICE    15 年前

    另一个用于允许优化的未定义行为的巨大示例是别名规则。

        3
  •  4
  •   J-16 SDiZ    15 年前

    这个 undefined behavior 规范中的位涉及一些编译器优化。例如:

    if (a > 0 && b > 0) {
        if ( a + b <= 0 ) {
           // this branch may be optimized out by compiler
        } else {
           // this branch will always run
        }
    }
    

    现代的C编译器并不是那么简单,它做了很多猜测和优化。

        4
  •  0
  •   Jens Gustedt    15 年前

    我认为你的假设1)如果我的记忆是正确的,那么至少在一个重要的历史架构CDC上,对于任何给定的处理器,这都是错误的。