如何将short转换为ASCII?

时间:2015-04-06 06:38:36

标签: c embedded converter

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

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

由于

1 个答案:

答案 0 :(得分:0)

根据@Potatoswatter简洁的评论,您可以使用标准itoa()

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

以下是另一种实现方式。流动是一种紧凑的递归解决方案,不需要反转其结果。它适用于所有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;
}