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。任何人都可以帮我理解这个功能的操作吗?
答案 0 :(得分:2)
通过进位传播进行多精度加法。 a
和b
参数是指向多精度整数的指针,每个整数具有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加载到下一对元素。因此,此函数添加任意精度的无符号数a
和b
(表示为小端数组),将结果复制到r
,并返回是否存在溢出。