1234567890123456789012345678901234567890123456789012345678901234不是64位数字.它是一个64 位十进制数字,需要存储大约210+个二进制位.
尝试存储64位数字
long long s1 = 9223372036854775807;
long long s2 = -9223372036854775807 - 1;
unsigned long long u1 = 18446744073709551615u;
Run Code Online (Sandbox Code Playgroud)
要在标准C中存储64位十进制数,您需要使用另一种方法,因为C的整数类型仅指定最多64个二进制数字(位),尽管可能存在更宽的数字:存储为您自己的数字数组,如字符串,或使用像gmp一样的bignum库.这取决于你想用存储的64位十进制数字做什么.
示例字符串方法.它缺乏缓冲保护,也没有删除前导零,效率也不高.它确实展示了所需要的流程 - 基本的长乘法.
char *string_mult2(char *product, const char *a, const char *b) {
size_t alen = strlen(a);
size_t blen = strlen(b);
size_t clen = alen + blen;
memset(product, '0', clen);
product[clen] = 0;
for (size_t ai = alen; ai-- > 0;) {
unsigned acc = 0;
size_t ci = --clen;
for (size_t bi = blen; bi-- > 0;) {
acc += product[ci] - '0' + (a[ai] - '0') * (b[bi] - '0');
product[ci--] = acc % 10 + '0';
acc /= 10;
}
product[ci] = acc % 10 + '0';
}
return product;
}
int main(void) {
char *a = "1234567890123456789012345678901234567890123456789012345678901234";
//a = "12";
char *b = a;
char product[200];
puts(string_mult2(product,a,b));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
在您尝试编译代码并运行它之后,将鼠标悬停在下面以查看我的结果.
01524157875323883675049535156256668194500838287337600975522511810828928529615005335814711781866792303015211342784374345526722756