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

65 篇文章 1 订阅
请用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 ; }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值