二进制补码算法

时间:2017-10-13 00:55:14

标签: c computer-science

#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");
          }

任何人都可以解释为什么总和的结果会小于0? 以及while循环将如何结束?

1 个答案:

答案 0 :(得分:3)

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

i有类似的问题(如果我们修复了sum问题,那将首先溢出。

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

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