1 #include
2
3 typedef unsigned charu8;4 typedef unsigned intu32;5
6 #define N 32
7 #define CARRYNUM 0x100
8
9 void BigMul(u8* res_high, u8* res_low, u8 *a, u8 *b)10 {11 intai, bi, ri;12 u32 tmp;13 u32 res[N*2] = {0};14 u8 c[N*2] = {0};15
16 //乘法计算核心部分
17 for(ai = N-1; ai >= 0; ai--) //a从后往前,低位往高位乘起来
18 {19 for(bi = N-1; bi >=0; bi--) //b从后往前,低位往高位乘起来
20 {21 tmp = a[ai] *b[bi];22 res[ai+bi+1] += (tmp % CARRYNUM); //取低位,并累加所有相同下标
23 res[ai+bi] += (tmp / CARRYNUM); //取高位,并累加所有相同下标
24 }25 }26 for(ri = (2*N)-1; ri > 0; ri--)27 {28 if(res[ri] > CARRYNUM-1) //从res低位开始判断,若大于0x100,向高位进位
29 {30 res[ri-1] += (res[ri]/CARRYNUM); //低位 进位数加到 高位
31 res[ri] = res[ri]%CARRYNUM; //低位数的进位去掉,保留低位数的低位
32 }33 }34
35 //输出
36 for(ri = 0; ri < 2*N; ri++)37 {38 if(ri
41 res_low[ri-N] =res[ri];42 }43 return;44 }45
46 void print_num(u8* res_high, u8*res_low)47 {48 int i = 0;49 for(i = 0; i < N; i++)50 {51 printf("%02x", res_high[i]);52 }53
54 for(i = 0; i < N; i++)55 {56 printf("%02x", res_low[i]);57 }58 }59
60 voidmain()61 {62 //数组[0]数据高位, [31]数据低位63 //u8 a[N] = {0xDE,0x2A,0x7C,0xF8,0x48,0x24,0xCF,0xA0,0xCE,0xD7,0x16,0xAD,0xF5,0xD4,0x7D,0xE9,0x3D,0xFA,0x31,0xEB,0x69,0x26,0xB7,0xF7,0xDF,0x69,0xBD,0xE0,0x1F,0x9E,0xDB,0x0D};64 //u8 b[N] = {0x5A,0x1C,0x23,0x99,0x87,0x70,0x82,0xB8,0x12,0x50,0xCB,0x2A,0x7F,0x8B,0x74,0x53,0x5D,0x38,0x05,0xB5,0xB0,0xFE,0x8C,0x0E,0xF1,0xE7,0x73,0x15,0x47,0xD4,0x9A,0xA2};65
66 //u8 a[N] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};67 //u8 b[N] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};68
69 //u8 a[N] = {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};70 //u8 b[N] = {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};71
72 //u8 a[N] = {0x00,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};73 //u8 b[N] = {0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};
74
75 u8 a[N] = {0x00,0x00,0x00,0xD1,0xB8,0xAA,0x3E,0x1B,0x32,0xDB,0xB9,0x5A,0x13,0xB3,0x52,0x79,0x10,0x22,0x1E,0x47,0x49,0x00,0x8D,0xF9,0xA3,0x40,0xE6,0x9D,0x68,0x38,0x2C,0x58};76 u8 b[N] = {0x00,0x00,0x00,0x00,0x00,0xBF,0xB7,0x4C,0x0C,0xBF,0x09,0x13,0x1E,0x1E,0xEC,0x72,0x21,0x60,0xE5,0x5F,0xAD,0xCF,0x8E,0x50,0x50,0xE7,0xBA,0xF5,0xE9,0x6B,0x3D,0x5E};77
78
79 u8 res_high[N] = {0};80 u8 res_low[N] = {0};81 int i = 0;82
83 BigMul(res_high, res_low, a, b);84
85 print_num(res_high, res_low);86
87 }