【问题标题】:Two's complement arithmetic二进制补码算法
【发布时间】:2018-03-25 01:29:40
【问题描述】:
#include <stdio.h>
          int main() {
              int i = -1;
              int sum = 1000;
              printf("\nThe value of sum to start is:  %d", sum);
              while (i <= 0) {
                  i = i - 1;
                  sum = sum + 1; }
              if (sum == 0)
                  printf("\nSum is zero");
              if (sum < 0)
                  printf("\nSum is less than zero");
              if (sum > 0)
                  printf("\nSum is greater than zero");
              printf("\n");
          }

谁能解释为什么 sum 的结果会小于 0? while 循环将如何结束?

【问题讨论】:

    标签: c computer-science


    【解决方案1】:

    这个程序导致undefined behaviour。一段时间后,sum 将达到int 的最大可能值。然后sum + 1 由于算术运算溢出而导致未定义的行为。

    i也有类似的问题(如果我们修复了sum的问题,那就是先溢出)。

    未定义的行为意味着任何事情都可能发生。优化器可能会吐出看起来与实际代码无关的东西,或者编译器甚至可能拒绝编译代码(因为保证 UB 会在所有代码路径中发生)。

    Example compilation by gcc -- while 循环被替换为一个什么都不做的无限循环,因为优化器删除了一些未定义的代码路径。

    【讨论】:

    • 谢谢。现在说得通了。
    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多