我有一个长度为28的字符串,它以16为基数表示1个数字。

long num=strtol(str,NULL,16);

但它适用于小字符串,而不是长字符串(它给了我一个否定的结果)。那么对于长字符串,我该如何翻译呢?
//--------------------------
好吧,我认为只有一种方法不创造自行车。使用GMP。所以简单的代码如何使用GMP将是很好的答案。

最佳答案

由于代码以表示以16为基数的整数的字符串开头,因此也可以使用字符串表示以10为基数的数字。
足够简单,一次只能转换一个数字。
空间管理留给OP。

#include <stdio.h>
#include <stdlib.h>

char *baseNtobase10(char *s10, const char *s16, int n) {
  strcpy(s10, "0");
  size_t len = strlen(s10);
  while (*s16) {
    char sdigit[] = { *s16, 0 };
    char *endptr;
    int digit = (int) strtol(sdigit, &endptr, n);

    if (endptr == sdigit) return NULL;  // detect illegal digits

    // multiple s10[] = s10[] * n + digit
    for (size_t i = len; i-- > 0; ) {
      digit += (s10[i] - '0') * n;
      s10[i] = digit % 10 + '0';
      digit /= 10;
    }

    // handle carry oout
    while (digit) {
      memmove(s10 + 1, s10, len + 1);
      *s10 = digit % 10 + '0';
      digit /= 10;
      len++;
    }
    s16++;
  }
  return s10;
}

int main(void) {
  char s10[100];
  puts(baseNtobase10(s10, "123", 10));
  puts(baseNtobase10(s10, "123", 16));
  puts(baseNtobase10(s10, "1234567890123456789012345678", 16));
  return 0;
}

输出
123
291
369229998778771388878179932591736

关于c - c-long int太小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37402377/

10-09 05:04