比如,(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;
}