【问题标题】:c - long int is too smallc - long int 太小
【发布时间】:2016-05-23 23:57:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我认为 GCC 在 64 位机器上支持 128 位整数。
  • 你到底想做什么?为什么不让它保持原样?
  • 啊,所以你想将一个以 16 为底的大数转换为以 10 为底的相同数字。在这种情况下,我建议为此目的使用库。在 C 语言中,GMP 或 OpenSSL BIGNUM 可能是您的最佳选择。
  • @alex_mike 你为什么使用long int ?它不以 10 为基数存储数字表示,也不以 16 为基数存储数字表示。那么你用它做什么?我建议使用库类型,而不是 long int。

标签: c arrays int


【解决方案1】:

感谢@DavidSchwartz 在 cmets 中帮助我。所以解决方案是使用GMP库:

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

可能有问题,但它以某种方式起作用。如果您发现错误,请告诉我,我会为以后的人更改它。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 他使用的是 C,而不是 C++。
      猜你喜欢
      • 2019-12-12
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多