C 如何将整数转换为一系列字符
我试图在8位微控制器(PIC)上用C将一个整数分解为ASCII等效字符 例如: 将982转换为'9','8','2' 到目前为止,我所想到的一切似乎都是蛮力。这是我现在基本上正在做的主要想法: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
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((10ifsprintf
由于某种原因不适合,像这样简单的方法会奏效:
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这正是他所需要的!我已经发布了同样的汇编函数。