2014-03-01 2 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 함수에는 4 개의 인수가 있습니다. r, a 및 b는 uint32_t 유형의 배열에 대한 포인터입니다. 정수 n은 이들 배열의 길이를 지정한다 (즉, 3 개의 모든 배열 은 같은 수의 요소를 포함한다). 반환 값은 int 유형입니다. 누구든지 나를이 기능에 의해 수행되는 작업을 이해하도록 도울 수 있습니까?함수는 어떤 연산을 수행합니까?

답변

2

캐리 전파와 함께 다중 정밀도 가산을 수행 중입니다. ab 인수는 각각 n 자릿수의 다중 정밀도 정수에 대한 포인터입니다. 이 경우 숫자는 32 비트입니다. 최하위 숫자는 가장 낮은 배열 색인에 있습니다.

입력이 추가되고 결과는 r (또한 n 32 비트 숫자 포함)이 가리키는 배열에 배치됩니다. a의 자릿수를 b의 자릿수에 캐리 인 c과 함께 0으로 초기화하여 작동합니다. 캐리 아웃은 결과 디지트가 입력 디지트 중 하나보다 작거나 캐리 인이 1 인 경우 디지트 중 하나와 같을 때 감지됩니다. 리턴 값은 전체 연산에서의 캐리 아웃입니다.

기본 10 자리를 추가한다고 가정 해 보겠습니다. 9 + 9 + 0 mod 10을 계산하면 8이됩니다. 8이 9보다 작으므로 캐리 아웃이 있었음을 유추합니다. 9 + 9 + 1 모듈로 10을 계산하면 9가됩니다. 우리는 반입이 설정 되었기 때문에 반출을 추론합니다. 9 + 0 + 0을 계산하면 9가되지만 carry-in이 0이므로 캐리 아웃이 발생하지 않습니다.

0

루프의 각 요소에 대해 임시 변수는 두 개의 해당 요소 합계를 플래그가 설정되면 1을 더합니다. 그런 다음 플래그는 결과가 a의 요소보다 작 으면 설정되고, 더 큰 경우 재설정됩니다. 이 결과는 새 배열에 저장됩니다. 분명히 우리는 그 결과가 b[i] + c < 0 (>)의 요소보다 작고 (더 큼) 볼 수 있습니다. 그러나 두 지수 모두 양수 여야합니다. 3 개의 가수의 합계가 그 중 하나보다 작 으면 랩 어라운드가 있습니다. 따라서 변수 c은 덧셈이 오버플로되었는지 여부를 유지하며 다음 요소 쌍에 1을 전달하는 것과 같습니다. 따라서이 함수는 임의 정밀도의 부호없는 숫자 ab (리틀 엔디안 배열로 표시됨)을 더하고 결과를 r에 복사하고 오버플로가 있는지 여부를 반환합니다.

관련 문제