征集c语言的多字节的加减乘除?该如何解决

征集c语言的多字节的加减乘除?
c语言的:
我们经常会遇到多字节的加、减、乘、除,现在请各位大虾讨论一下,多字节的算法问题?
for   example:
1.       a[]={0x20,0x21,0x22,0x23}
          b[]={0x10,0x11,0x12,0x13}
求a+b;
a-b;
a*b;
a/b;


------解决方案--------------------
大数运算
------解决方案--------------------
见意找计算机组成原理的书看,里面有关于二进制加、减、乘、除的运算过程。

------解决方案--------------------
大数运算的思想就是用数组保存某个数字的各个数据位,
然后进行运算,并同样分割保存结果。

参考下面:
/*用数组存储数字,可以超越数据类型的限制,实现极大数的加法,减法和乘法 */
/*2005-3-7 梁见斌*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 80

int a[MAX]={0}, b[MAX]={0};
int *r, *s;
char e[40], f[40];/* e[30]和f[30]存放以字符串形式输入的乘数和被乘数*/
char *p, *q;

void NiZhi(int *ShuZu, int len);/*把数字逆置,把个位数字存储在a[0]*/
void ZhuanHuan(char *ZhiFu, int *ShuZi, int len);/*把字符改存为整型数字*/
int PanDuan(int len);/*当len1=len2时判断a[]和 b[]谁大 */
void JiaFa(int len1, int len2);
void JianFa(int len1, int len2);
void ChengFa(int len1, int len2);

int main(void)
{
int len1, len2;
int choice;

do{
puts( "请您选择操作的方式: ");
puts( "\t加法请按1 ");
puts( "\t减法请按2 ");
puts( "\t乘法请按3 ");
scanf( "%d ", &choice);
}while(choice < 1 || choice > 3);

r=a;
s=b;
p=e;
q=f;
puts( "Inter m: ");
scanf( "%s ", p);
puts( "Inter n: ");
scanf( "%s ", q);

len1=strlen(e);
len2=strlen(f);
ZhuanHuan(p, r, len1);
ZhuanHuan(q, s, len2);

NiZhi(r, len1);
NiZhi(s, len2);

switch(choice)
{
case 1: JiaFa(len1, len2);
break;
case 2: JianFa(len1, len2);
break;
case 3: ChengFa(len1, len2);
break;
default: printf( "It 's error ");
}

system( "pause ");
return 0;
}

void NiZhi(int *ShuZu, int len)
{
int i, t;
for(i=0; i <len/2; i++)
{
t=*(ShuZu+i);
*(ShuZu+i)=*(ShuZu+len-i-1);
*(ShuZu+len-i-1)=t;
}
}

void ZhuanHuan(char *ZhiFu, int *ShuZi, int len)
{
int i;
for(i=0; i <=len-1; i++)
*(ShuZi+i)=int(*(ZhiFu+i))-48;
}

void ChengFa(int len1, int len2)
{
int i, j, k;
int c[MAX]={0}, aa[MAX]={0};/*a[max]和aa[max]存放被乘数,b[max]存放乘数,c[max]存放积*/
int x, jinwei, d;

for(i=0; i <=len2; i++)
{
for(j=0; j <=len1; j++)/*每次都使 aa[ ]表示被乘数*/
aa[j]=a[j];
d=20;/*提供足够多的存储空间以存放积的进位,此处设为20,可根据数据的大小调节*/
jinwei=0;/*c表示积的进位,初值为0*/

for(j=0; j <=len1+d; j++)/*用乘数的每一位从个位开始依次和被乘数相乘,用aa[ ]存储当前积*/
{
x=aa[j]*b[i]+jinwei;
jinwei=x/10;
aa[j]=x%10;
}
while(a[j] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/
j--;

d=4;/*提供足够多的存储空间以存放积的进位,此处设为4,可根据数据的大小调节*/
jinwei=0;/*c表示积的进位,初值为0*/
for(k=0; k <=j+d; k++)/*c[max]存放原始积,注意每次把当前积与原始积时相加时两者的位置对应情况*/
{
x=aa[k]+c[k+i]+jinwei;