如何用C语言设计一个32位无符号数长整数求和的函数?相加之和存储在两个32位无符号整数中 .输入的是两个 int型的,相加之后存储在两个int型的32位中
来源:学生作业帮助网 编辑:作业帮 时间:2024/07/04 22:49:42
![如何用C语言设计一个32位无符号数长整数求和的函数?相加之和存储在两个32位无符号整数中 .输入的是两个 int型的,相加之后存储在两个int型的32位中](/uploads/image/z/7136092-28-2.jpg?t=%E5%A6%82%E4%BD%95%E7%94%A8C%E8%AF%AD%E8%A8%80%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA32%E4%BD%8D%E6%97%A0%E7%AC%A6%E5%8F%B7%E6%95%B0%E9%95%BF%E6%95%B4%E6%95%B0%E6%B1%82%E5%92%8C%E7%9A%84%E5%87%BD%E6%95%B0%3F%E7%9B%B8%E5%8A%A0%E4%B9%8B%E5%92%8C%E5%AD%98%E5%82%A8%E5%9C%A8%E4%B8%A4%E4%B8%AA32%E4%BD%8D%E6%97%A0%E7%AC%A6%E5%8F%B7%E6%95%B4%E6%95%B0%E4%B8%AD+.%E8%BE%93%E5%85%A5%E7%9A%84%E6%98%AF%E4%B8%A4%E4%B8%AA+int%E5%9E%8B%E7%9A%84%2C%E7%9B%B8%E5%8A%A0%E4%B9%8B%E5%90%8E%E5%AD%98%E5%82%A8%E5%9C%A8%E4%B8%A4%E4%B8%AAint%E5%9E%8B%E7%9A%8432%E4%BD%8D%E4%B8%AD)
如何用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]);
}