c - long int太小

时间:2016-05-23 23:57:44

标签: c arrays int

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

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

但它适用于小字符串,但不是长字符串(它给了我一个否定的结果)。那么对于长字符串,我该如何翻译呢?

// --------------------------

嗯,我认为没有创造自行车只有一种方法。使用GMP。如此简单的代码以及如何使用GMP将是一个很好的答案。

3 个答案:

答案 0 :(得分:2)

非常感谢@DavidSchwartz帮我评论。所以解决方案是使用GMP库:

mpz_t res;
mpz_init_set_str (res, str, 16);
gmp_fprintf(f1,"%s",mpz_get_str(NULL,10,res));
mpz_clear (res);

可能有些不对劲,但它以某种方式起作用。如果您发现错误让我知道,我会为未来的人改变它。

答案 1 :(得分:1)

由于代码以表示基数为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

答案 2 :(得分:0)

我打算建议strtoll,但这只是16个字符或64位。我建议你使用bigint库,它有更高的限制。