该功能执行什么操作?

时间:2014-03-01 05:38:50

标签: c functional-programming ansi

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 个答案:

答案 0 :(得分:2)

通过进位传播进行多精度加法。 ab参数是指向多精度整数的指针,每个整数具有n个数字。在这种情况下,数字是32位。最低有效数字位于最低数组索引中。

添加输入,结果放入r指向的数组(也包含n 32位数字)。它的工作原理是将a的数字添加到b的数字,并带有进位c,该数据初始化为零。当结果数字小于输入数字之一时检测到进位,或者当进位数为1时等于其中一个数字。返回值是整个操作的进位。

想象一下,我们正在添加10位数字。如果我们计算9 + 9 + 0 mod 10,我们得到8.由于8小于9,我们推断必须有一个进位。如果我们计算9 + 9 + 1模10,我们得到9;我们推断出结转,因为结转了。如果我们计算9 + 0 + 0,我们得到9,但是没有结转,因为进位是0。

答案 1 :(得分:0)

在循环的每个元素上,临时变量在a和b中存储两个相应元素的总和,如果设置了标志则添加1。然后,当结果小于a中的元素时设置标志,如果更大则重置。此结果存储在新数组中。显然,我们可以看到结果比if b[i] + c < 0>)中的元素更少(更大)。但是,两个指数都必须是正数;如果三个加数的总和少于其中一个,则有一个回绕。因此,变量c保持加法是否溢出,并且相当于将1加载到下一对元素。因此,此函数添加任意精度的无符号数ab(表示为小端数组),将结果复制到r,并返回是否存在溢出。