【问题标题】:c - Long Long to char conversion function in embedded systemc - 嵌入式系统中 Long Long 到 char 的转换函数
【发布时间】:2013-09-17 19:17:42
【问题描述】:

我正在使用嵌入式系统,我需要实现一种将 long long 转换为 char 的方法。

问题是我不能在这个系统中使用 sprintf 来做到这一点,所以我正在寻找替代方法/功能来实现它。

欢迎提出 LongLongToChar 函数的实现建议。

【问题讨论】:

    标签: c char long-integer


    【解决方案1】:

    谷歌“itoa”。有很多变化。这是一个例子。

    char* itoa(int val, int base){
    
        static char buf[32] = {0};
    
        int i = 30;
    
        for(; val && i ; --i, val /= base)
    
            buf[i] = "0123456789abcdef"[val % base];
    
        return &buf[i+1];
    
    }
    

    具体来说,这里是一个“lltoa”。

    #include <stdio.h>
    #include <limits.h>
    
    
    char* lltoa(long long val, int base){
    
        static char buf[64] = {0};
    
        int i = 62;
        int sign = (val < 0);
        if(sign) val = -val;
    
        if(val == 0) return "0";
    
        for(; val && i ; --i, val /= base) {
            buf[i] = "0123456789abcdef"[val % base];
        }
    
        if(sign) {
            buf[i--] = '-';
        }
        return &buf[i+1];
    
    }
    
    int main() {
        long long a = LLONG_MAX;
        long long b = LLONG_MIN + 1;
        long long c = 23;
    
        printf("%ld\n", sizeof(a));
        printf("max '%s'\n", lltoa(a, 10));
        printf("min '%s'\n", lltoa(b, 10));
        printf("-1  '%s'\n", lltoa((long long)-1, 10));
        printf("23  '%s'\n", lltoa(c, 10));
    }
    

    【讨论】:

    • 您可能希望 base = 10。这与 sprintf 中的 %d 相同。注意缓冲区大小,不要忘记减号。
    • @chux,说得好。谢谢。这很尴尬。这就是我复制代码所得到的。
    • @Charlie Burns long long 至少为 64 位,基数为 2,您可能需要 buf[64]i = 30+32
    • @ManuelCobra:如果您不需要基数 10(对于用户),您应该考虑坚持使用基数 16(十六进制),因为“除数”将是移位,在嵌入式 MCU 上会便宜得多比除法(这必须由编译器导入的库例程完成)。如果你不能适应sprintf,你可能也不想拖入大整数除法。
    • @Ben Jackson 同意“大整数除法”在嵌入式中的时间成本可能很高,但sprintf 在空间和时间上都可能巨大。了解 OP 的空间/时间需求将有助于解决问题。
    【解决方案2】:

    使用lldiv(),在单独的/% 上节省CPU 时间。
    适用于整个long long 范围,包括0 和讨厌的LONG_LONG_MIN

    const char *ToString(long long i) {
      static char buffer[sizeof(i)*3 + 1];  // Size could be a bit tighter
      char *p = &buffer[sizeof(buffer)];
      *(--p) = '\0';
      lldiv_t qr;
      qr.quot = i;
      do {
        qr = lldiv(qr.quot, 10);
        *(--p) = abs(qr.rem) + '0';
      } while (qr.quot);
      if (i < 0) {
        *(--p) = '-';
      }
      return p;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多