请用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; }

本文介绍了一个在32位环境下实现32位无符号整数求和的函数,通过判断溢出情况来更新高位和低位的和,确保结果正确。
2787

被折叠的 条评论
为什么被折叠?



