请用C语言在32位环境下,设计一个32位无符号长整数求和函数,相加之和存储在两个32位无符号整数中,
函数接口定义为
void Add64(unsigned int add1, unsigned int add2, unsigned int* pSumHigh, unsigned int* pSumLow)
上面其实写的复杂了,这思路用在乘法上更合理些。
对于加法,其实这个 SumHigh 最大值可能 1,也就是说,要不是 0,要不是 1,这样可以通过判断是否有溢出,两个无符号整数相加,溢出等价于和小于某一个加数(如果不去判断寄存器标识位的话)。那么,可以这样:
函数接口定义为
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 ; }