2020年1月13日 星期一

二的補數 問題

題目:
If numeric values are represented in two's complement notation, does the following program represent an infinite process? Explain your answer.

x←2
while(x > 0) do
    (x← x + 1)

也就是問說如果以2的補數一直加1,是否恆為正數?




在這個表格裡,表示三個位元的二的補數,由此可知當數字一路加上去到011,也就是+3時,再+1的時候並不會變成+4,而是繞到表格最底端-4,也就是111。

雖然題目並沒有告訴我們有幾個位元來表示二的補數,但不論大小為何,最終必定來到可表達數字的上限,然後繞回到可表達數字的下限。

依此邏輯,我們也可以寫一個間單的程式來檢驗這個想法。

#include <stdio.h>

int main(void)
{
 int a = 2000000000;
 while (a > 0)
 {
  printf("%d\n", a);
  a += 5000000;
 }
 return 0;
}

這個程式將會無止盡的執行嗎?還是會在特定的數字後跳脫while呢?

實際執行後會發現程式在輸出2145000000這個數字後終止,原因是因為int可表達的範圍是-2147483648 to 2147483647,如果跳脫while後把a再印一次,會發現這時候的a正是在負極值端。

其實這個小實驗用a=1,且每次+1也可以,只是為了減少輸出的數目與執行時間。

沒有留言:

張貼留言