用两个32位无符号整型数计算两个32位无符号整形数的加法

比如,(2^32-1) + (2^32-1)必然超过了unsigned int 的显示上限,所以,需要两个unsigned int数联合表达。这是我根据汇编语言得到的灵感。在汇编语言编程中,进位加法:adc以及与之配合的adds,高32位计算结果存放在r1寄存器中,低32位计算结果存放在r0寄存器中。我们可以采取相同的方案。

#include <stdio.h>
void add(unsigned int a, unsigned int b);
int main()
{
	unsigned int a, b;
	printf("请输入a, b的值:");
	scanf("%d%d",&a,&b);
	add(a, b);
	return 0;
}
void add(unsigned int a, unsigned int b)
{
	unsigned int x, y;
	y = a + b;
	if(y <= a && y <= b)
	{
		x = 1;
	}else
	{
		x = 0;
	}
	printf("a代表的是0xffffffff+1\n");
	printf("x=%d  y=%d\n",x,y);
}

但是与汇编语言的二进制运算不同,这种做法治标不治本,所以,我们还可以采用用数组存答案的二进制解方法。用int [33]存二进制结果

#include <stdio.h>
int* add(unsigned int a, unsigned int b, int str[]);
int *str_int(int *str, unsigned int a);
int main()
{
	unsigned int a, b;
	int str[33];
	int i = 0;
	printf("请输入a, b的值:");
	scanf("%d%d",&a,&b);
	add(a, b, str);
	for(i=0; i<33; i++)
	printf("%d", str[i]);
	return 0;
}
int* add(unsigned int a, unsigned int b, int str[])
{
	int i, temp, index=0;
	//static char str[33];	//存储结果 
	int arr[32];
	int brr[32];
	str_int(arr, a);
	str_int(brr, b);
	//此时arr和brr中,存储了二进制的a、b
	for(i=32; i>=0; i--)
	{
		temp = brr[i-1]+arr[i-1];
		if(index == 0)			//代表前一位没有进位
		{
			if(temp==1 || temp==0)
			{
				index = 0;		//代表没有进位
			 	str[i] = temp;	//直接把值存入 
			}else
			{
				index = 1;		//代表出现进位的情况
			 	str[i] = 0;		//1+1 = 2,在二进制就是0 
			}
		}else					//代表前一位有进位 
		{
			if(temp == 0)		//00
			{
				index = 0;		//进位抹除
				str[i] = 1; //01
			}
			else if(temp == 1)	//01
			{
				index = 1;		//还是有进位
				str[i] = 0; 	//10
			}
			else if(temp == 2)  //10
			{
				index = 1;
				str[i] = 1;		//11
			}
		}
	}
	return str;
}
int *str_int(int *str, unsigned int a)	//转换成2进制 
{
	int i;
	for(i=31; i>=0; i--)
	{
		str[i] = a%2;
		a = a/2; 
	}
	return str;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老K殿下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值