请用C语言在32位环境下,设计一个32位无符号长整数求和函数,相加之和存储在两个32位无符号整数

请用C语言在32位环境下,设计一个32位无符号长整数求和函数,相加之和存储在两个32位无符号整数中,
函数接口定义为

void Add64(unsigned int add1, unsigned int add2, unsigned int* pSumHigh, unsigned int* pSumLow)

请给出函数的实现代码。


不用 64 位类型的话可以这样:

C/C++ code
 
 void Add64(unsigned int add1, unsigned int add2, unsigned int* pSumHigh, unsigned int* pSumLow) 
 { 
 	*pSumLow = add1; 
 	*pSumHigh = 0; 
  
 	unsigned int i = 0; 
  
 	do  
 	{ 
 		if (++*pSumLow == 0) 
 		{ 
 			++*pSumHigh; 
 		} 
  
 	} while (++i  < add2); 
 } 
  
 int _tmain(int argc, _TCHAR* argv[]) 
 { 
 	unsigned int h, l; 
  
 	Add64(0xffffff00, 0x000000ff, &h, &l);	// 0x00000000, 0xffffffff 
 	Add64(0xffffffff, 0x00000001, &h, &l);	// 0x00000001, 0x00000000 
 	Add64(0xffffffff, 0x00000003, &h, &l);	// 0x00000001, 0x00000002 
  
 	return 0; 
 } 
  
 


上面其实写的复杂了,这思路用在乘法上更合理些。

对于加法,其实这个 SumHigh 最大值可能 1,也就是说,要不是 0,要不是 1,这样可以通过判断是否有溢出,两个无符号整数相加,溢出等价于和小于某一个加数(如果不去判断寄存器标识位的话)。那么,可以这样:
C/C++ code
    
    
    
    
void Add64(unsigned int add1, unsigned int add2, unsigned int * pSumHigh, unsigned int * pSumLow) { * pSumLow = add1 + add2; if ( * pSumLow < add1 || * pSumHigh < add2) { * pSumHigh = 1 ; } else { * pSumHigh = 0 ; } } int _tmain( int argc, _TCHAR * argv[]) { unsigned int h, l; Add64( 0xffffff00 , 0x000000ff , & h, & l); // 0x00000000, 0xffffffff Add64( 0xffffffff , 0x00000001 , & h, & l); // 0x00000001, 0x00000000 Add64( 0xffffffff , 0x00000003 , & h, & l); // 0x00000001, 0x00000002 return 0 ; }

你可能感兴趣的:(c,存储,语言)