【发布时间】:2021-12-08 09:29:15
【问题描述】:
我正在尝试为我的第一次测试编写一个大整数乘法,但如果 uint8_t 数字大于一个,则结果是错误的。我尝试了 2 天以找到解决方案并了解我做错了什么......
void main(void){
uint8_t x[] = {0xFF};
uint8_t y[] = {0xFF};
uint8_t z[] = {0x00, 0x00};
mul(x,1,y,1,z);
printf("X*Y = Z: ");
for(int i = 0; i < 2; i++)
printf("%02X ",z[i]);
printf("\n");
//Output: X*Y = Z: FE 01 == FE01 CORRECT!
uint8_t a[] = {0x0F, 0xFF};
uint8_t b[] = {0x0F, 0xFF};
uint8_t c[] = {0x00, 0x00, 0x00, 0x00};
mul(a,2,b,2,c);
printf("A*B = C: ");
for(int i = 0; i < 4; i++)
printf("%02X ",c[i]);
printf("\n");
//Output: A*B = C: 00 FE E0 01 != FFE001 WRONG?!
}
void mul(uint8_t *a, int a_n,uint8_t *b, int b_n,uint8_t *c){
int i,j;
uint16_t A;
for(i = a_n-1; i >= 0; i--){
A=0;
for(j = b_n-1; j >= 0; j--){
A += (uint16_t) a[i] * b[j];
c[i+j+1] += A;
A >>= 8;
}
c[i] = A;;
}
}
【问题讨论】:
-
你没有正确地进行携带。当
c[i+j+1] + A大于0xFF时,需要将溢出进位到下一位。只有当a[i] * b[i]溢出时,你才会携带。
标签: c multiplication biginteger bigint