C 如何将整数转换为一系列字符

C 如何将整数转换为一系列字符,c,integer,ascii,character,pic,C,Integer,Ascii,Character,Pic,我试图在8位微控制器(PIC)上用C将一个整数分解为ASCII等效字符 例如: 将982转换为'9','8','2' 到目前为止,我所想到的一切似乎都是蛮力。这是我现在基本上正在做的主要想法: if( (10 <= n) && (n < 100) ) { // isolate and update the first order of magnitude digit_0 = (n % 10); // isolate and update the second orde

我试图在8位微控制器(PIC)上用C将一个整数分解为ASCII等效字符

例如: 将982转换为'9','8','2'

到目前为止,我所想到的一切似乎都是蛮力。这是我现在基本上正在做的主要想法:

if( (10 <= n) && (n < 100) ) {
// isolate and update the first order of magnitude
digit_0 = (n % 10);
// isolate and update the second order of magnitude
switch( n - (n % 10) ) {
  case 0:
    digit_1 = 0;
    break;
  case 10:
    digit_1 = 1;
    break;

if((10if
sprintf
由于某种原因不适合,像这样简单的方法会奏效:

char digits[MAX_DIGITS];
int count = 0;
do {
    digits[count++] = n % 10;
    n /= 10;
} while (n > 0);

将有
计数
位数,其中
位数[0]
是最不重要的。

要自己完成,您需要执行以下示例代码演示的操作:

#include <stdio.h>

int main (void)
{
  unsigned int x = 512;
  int base_val = 10, digit, i = 0, n = 0;
  char x_str[32], t;

  printf ("\nEnter an unsigned number: ");
  scanf ("%u", &x);

  printf ("\nEnter base: ");
  scanf ("%d", &base_val);

  /* Chop the digits in reverse order and store in `x_arr`
   * the interpretation of the digits are made in base value
   * denoted by `base_val`
   */

  while (x)
  {
    digit = x % base_val;
    x /= base_val;
    if (digit < 10)
      x_str[n++] = digit + '0';
    else
      x_str[n++] = digit + 'A' - 10;  /* handle base > 9 */
  }

  /* Terminate string */
  x_str[n] = '\0';

  /* Reverse string */
  for (i=0; i<n/2; i++)
  {
    t = x_str[i];
    x_str[i] = x_str[n-i-1];
    x_str[n-i-1] = t;
  }
  printf ("\n%s\n", x_str);

  return 0;
}
#包括
内部主(空)
{
无符号整数x=512;
int base_val=10,数字,i=0,n=0;
char x_str[32],t;
printf(“\n输入一个无符号的数字:”);
scanf(“%u”、&x);
printf(“\n输入基:”);
scanf(“%d”&base_val);
/*将数字按相反顺序切掉并存储在'x_arr'中`
*数字的解释是在基准值中进行的
*用'base_val'表示`
*/
while(x)
{
数字=x%基准值;
x/=基准值;
如果(数字<10)
x_str[n++]=数字+'0';
其他的
x_str[n++]=数字+'A'-10;/*句柄基数>9*/
}
/*终止字符串*/
x_str[n]='\0';
/*反向串*/

对于(i=0;i而言,如果您与PIC16 RISC汇编程序兼容,那么这将是非常简单、快速、简短和有效的。这里有16位无符号16位除以10的rutine,以了解如何执行此操作

要获取WREG中数字的第一个最低字符,请将16位无符号数字放入Reg1和Reg2并调用rutine。要获取下一个字符,请再次调用rutine,依此类推,直到Reg1和Reg2为0

RegAE       res 1
RegA0       res 1
RegA1       res 1
RegA2       res 1



    divR16by_c10
    ;{
    ;//Input: 16 bit unsigned number as RegA1,2 (RegA2 low byte, RegA1 High byte)
    ;//Division result: Reg1 and Reg2 and reminder as char in WREG
            clrf    RegA0
            movlw   16             ;//init loop counter
            movwf   RegAE
            lslf    RegA2, f
    divI16by_c10_        
            rlf     RegA1, f
            rlf     RegA0, f       
            movlw   10
            subwf   RegA0, f
            btfsc   Carry
            bra     divI16by_c10_OK
            addwfc  RegA0, f
            bcf     Carry
    divI16by_c10_OK        
            rlf     RegA2, f
            decfsz  RegAE, f
            bra     divI16by_c10_
    ;//result= W from 0..9
            addlw   0x30        ;//convert to char
            return 
    ;}
编辑:

如果要转换有符号的16位值,则首先检查第15位,以确定符号编号。如果为负数,则在REG1,2中写入-符号并对数字求反。之后的步骤与正数相同。 要对数字求反,可以使用以下asm rutine:

             comf    RegA2, f
             comf    RegA1, f
             movlw   0
             bsf     STATUS, 0      ;//set carry flag
             addwfc  RegA2, f
             addwfc  RegA1, f 

我很久以前就回答过这样一个问题

我希望这有帮助。这适用于整数和浮点数。概念很简单

  • 确定位数(对于基数10,使用对数基数10)
  • 以(num/digit\u weight)为底数抓住msb位
  • 从数字中减去数字*权重,并将权重减少1
  • 再次执行此操作,直到整数的number==0或fp数的num>0+公差

  • 由于算法在每次迭代中处理一个数字,因此其O(logn)这是一个微控制器。你的代码是有效的,但printf和scanf可能不可用。上面的代码只是演示while循环和for循环的工作原理。Tarabyte使用一个小的8位MCPU和几千字的闪存程序内存,所以在这种情况下使用log函数是不合理的。我的函数ion只使用17个字的程序内存,而且速度快、简短、有效,而且用c或任何其他语言编写都很简单。+1这正是他所需要的!我已经发布了同样的汇编函数。