c - 如何将短格式转换为 ASCII?

标签 c embedded converters

C中将短数字转换为ascii的最佳方法是什么(通过速度优化)(-1,5,1000到“-1”,“5”,“1000”) .

我需要它用于嵌入式 MCU,因此 sprintf() 不是一个选项。

谢谢

最佳答案

@Potatoswatter简洁的评论,使用标准的 itoa() 就可以了。

至于什么是最快的:最好是分析候选解决方案。在一个平台上最有效的方法在另一个平台上可能会有所不同。

下面是一个替代实现。 Flowing 是一种紧密递归解决方案,不需要反转其结果。它适用于所有 int:[INT_MIN, INT_MAX],因为它适用于与 int 大小相同或大于其负数的一侧积极的一面。

static char *itoa10_helper(int n, char *s) {
  if (n <= -10) {
    s = itoa10_helper(n / 10, s);
  }
  *s = (char) ('0' - n % 10);
  return ++s;
}

char* itoa10(int n, char *s) {
  if (n < 0) {
    *s = '-';
    *itoa10_helper(n, s+1) = 0;
  } else {
    *itoa10_helper(-n, s) = 0;
  }
  return s;
}

#include <limits.h>
#include <stdio.h>
#define INT_MAX_SIZE (sizeof (int)*CHAR_BIT/3 + 3)

int main(void) {
  char buf[INT_MAX_SIZE];
  puts(itoa10(0, buf));
  puts(itoa10(123, buf));
  puts(itoa10(INT_MAX, buf));
  puts(itoa10(INT_MIN, buf));
  return 0;
}
<小时/>

一个快速解决方案,它在提供的缓冲区中某处返回一个指针,如下所示:

#include <stdbool.h>

char* itoa10f(int n, char *buf) {
  char *s = buf + INT_MAX_SIZE - 1;
  *s = '\0';
  bool isnegative = n < 0;
  if (!isnegative) {
    n = -n;
  }
  do {
    *(--s) = (char) ('0' - n % 10);
  } while (n /= 10);
  if (isnegative) {
    *(--s) = '-';
  }
  return s;
}

关于c - 如何将短格式转换为 ASCII?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29466549/

相关文章:

c - 需要未移位的寄存器 - 汇编器在 TST 指令上抛出错误

c - 估计 C 库的内存占用和 CPU 使用率

c++ - 就嵌入式系统的大小而言,我可以获得多小的完整编译器(如 clang 或 gcc)?

c - 一个简单的 8051 C 中断事件计数器演示,不递增。

c# - 更新对象时 JsonConvert PopulateObject 不会将 null 值填充为可为 null 的整数

c - 为什么fmp4文件用VLC解码不了音频,用PotPlayer可以正常播放

c - 如何使用 CX_LIMITED_RANGE 开/关

linux - 在处理 init 之前强制加载 Linux 内核

使用 IMultiValueConverter 的 Wpf 数据绑定(bind)和转换错误

c - 为什么这段代码与 bin 一起使用时会崩溃?