如何用C語言設計一個32位無符號數長整數求和的函數?相加之和存儲在兩個32位無符號整數中 .輸入的是兩個 int型的,相
題目:
如何用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]);
}
添加新評論