如何用C语言设计一个32位无符号数长整数求和的函数?相加之和存储在两个32位无符号整数中 .输入的是两个 int型的,相加之后存储在两个int型的32位中
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/30 05:05:06
如何用C语言设计一个32位无符号数长整数求和的函数?相加之和存储在两个32位无符号整数中 .输入的是两个 int型的,相加之后存储在两个int型的32位中
如何用C语言设计一个32位无符号数长整数求和的函数?相加之和存储在两个32位无符号整数中 .输入的是两个 int型的,相加之后存储在两个int型的32位中
如何用C语言设计一个32位无符号数长整数求和的函数?相加之和存储在两个32位无符号整数中 .输入的是两个 int型的,相加之后存储在两个int型的32位中
两个32位相加,结果肯定小于32位 * 2即33位,所以结果的两个无符数中高位的那个只能是0或者1
当相加的两个数太大发生溢出的时候,结果的高32位手工置为1; 没有溢出的时候为0
所以低32位就是直接相加,而高32位的值取决于相加的两个数是否会造成溢出
如果溢出,直接相加的结果会被截断,所以c = a + b,如果发生溢出,截断后的c是小于a且小于b的,因为有部分被用来填充了
上面就是原理
void add(unsigned int lhs,unsigned int rhs,unsigned int *pResult)
{
pResult[1] = rhs + lhs;
pResult[0] = pResult[1] < lhs && pResult[1] < rhs;
}
void add2(unsigned lhs,unsigned rhs,unsigned *pResult)
{
// 呃..这是无聊的做法; 标准当中long long是64位的
long long l = lhs;
l += rhs;
unsigned *p = (unsigned*)&l;
pResult[0] = p[1];
pResult[1] = p[0];
}
int main()
{
unsigned int result[2] = {0};
add(1u,10u,result);
printf("%d,%d\n",result[0],result[1]);
add(1u,0xffffffffu,result);
printf("%d,%d\n",result[0],result[1]);
add(3u,0xffffffffu,result);
printf("%d,%d\n",result[0],result[1]);
add2(1u,10u,result);
printf("%d,%d\n",result[0],result[1]);
add2(1u,0xffffffffu,result);
printf("%d,%d\n",result[0],result[1]);
add2(3u,0xffffffffu,result);
printf("%d,%d\n",result[0],result[1]);
}