簡體   English   中英

二進制補碼算法

[英]Two's complement arithmetic

#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循環如何結束?

此程序導致未定義的行為 過了一會兒, sum將達到int的最大可能值。 然后sum + 1由於算術運算中的溢出而導致未定義的行為。

i有一個類似的問題(如果我們修復了sum問題,它將首先溢出)。

未定義的行為意味着任何事情都可能發生。 優化器可以吐出與實際代碼無關的東西,或者編譯器甚至可以拒絕編譯代碼(因為UB保證在所有代碼路徑中發生)。

gcc編譯示例 - while循環被無效循環替換,因為優化器刪除了一些未定義的代碼路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM