2014-03-01 65 views
0
int function(uint32_t *r, const uint32_t *a, const uint32_t *b, int n) 
{ 
int i; 
uint32_t ri, c=0; 
for (i = 0; i < n; i ++) 
{ 
    ri = a[i] + b[i] + c; 
    c = ((ri < a[i]) || ((ri == a[i]) && c)); 
    r[i] = ri; 
} 
    return ((int) c); 
} 

下面給出的C函數有四個參數:r,a和b是指向uint32_t類型的數組 的指針。整數n指定這些數組的長度(即,所有三個數組 包含相同數量的元素)。返回值是int類型的。任何人都可以幫助我理解這個函數執行的操作嗎?函數執行什麼操作?

回答

2

它正在進行帶進位傳播的多精度加法。參數ab是指向多精度整數的指針,每個數字爲n。在這種情況下,數字是32位。最低有效數字位於最低數組索引中。

添加輸入,並將結果放入由r指向的數組(也包含32位數字的n)。它的工作方式是將a中的數字加到b的數字中,並將其初始化爲零的進位c。當結果數字小於其中一個輸入數字時檢測到進位,或者當進位爲1時等於一位數字。返回值是整個操作的結果。

想象一下,我們正在添加基數爲10的數字。如果我們計算9 + 9 + 0模10,我們得到8.因爲8小於9,我們推斷必須有一個進位。如果我們計算9 + 9 + 1模10,我們得到9;我們推斷一個結轉,因爲結轉成立。如果我們計算9 + 0 + 0,我們得到9,但沒有執行,因爲進位是0.

0

在循環的每個元素上,一個臨時變量將一個臨時變量存儲在和b,並且如果設置了標誌則加1。然後,如果結果小於a中的元素,則設置該標誌,如果結果更大,則將其復位。這個結果存儲在一個新的數組中。顯然,我們可以看到結果比if(b[i] + c < 0>))中的元素少(大)。但是,這兩個指數必須是正面的;如果三個加數的總和小於其中一個,那麼就有一個概括。因此,變量c保持增加的溢出,並且相當於將1傳遞給下一對元素。因此,該函數會添加任意精度無符號數字ab(表示爲小端數組),將結果複製到r,並返回是否存在溢出。

相關問題