itoa алгоритм работы
Здравствуйте, comp,
Есть финкция itoa стандатной библиотеки stdlib.h. Так вот,
непонятно, как она работает? Ассемблер я понимаю, но не понимаю по
какому алгоритму она работает? Пожалуйста, кто волокет в этом
деле, напишите мне алгоритм преобразования,с пояснениями вот для
этого примера:
Есть целое,без знака 4-х байтное число, любое, которое надо
преобразовать(типа unsigned long b=0xf0ffffff)
Есть массив из 10 элементов размером 1 байт(типа char a[9]), куда
надо записать результат.
Сделать надо на чистом ассемблере,т.е. без библиотек,модулей...
Мне главное алгоритм, на ассемблер я сам переведу.
Приветствуются любые подсказки, которые помогут сдвинуть дело "с
мертвой точки". И еще, желательно заменить все умножения и деления
в алгоритме, на другие операции (сложение, вычетания,
циклический сдвиг регистра...) .
Это мне нужно для PIC16F84A,для отображения на LCD содержимого
памяти в десятичном формате.
Здравствуйте !
Смотрим в XTOA.C :
char * __cdecl _itoa (
int val,
char *buf,
int radix
)
{
if (radix == 10 && val < 0)
xtoa((unsigned long)val, buf, radix, 1);
else
xtoa((unsigned long)(unsigned int)val, buf, radix, 0);
return buf;
}
static void __cdecl xtoa (
unsigned long val,
char *buf,
unsigned radix,
int is_neg
)
{
char *p; /* pointer to traverse string */
char *firstdig; /* pointer to first digit */
char temp; /* temp char */
unsigned digval; /* value of digit */
p = buf;
if (is_neg) {
/* negative, so output '-' and negate */
*p++ = '-';
val = (unsigned long)(-(long)val);
}
firstdig = p; /* save pointer to first digit */
do {
digval = (unsigned) (val % radix);
val /= radix; /* get next digit */
/* convert to ascii and store */
if (digval > 9)
*p++ = (char) (digval - 10 + 'a'); /* a letter */
else
*p++ = (char) (digval + '0'); /* a digit */
} while (val > 0);
/* We now have the digit of the number in the buffer, but in reverse
order. Thus we reverse them now. */
*p-- = '\0'; /* terminate string; p points to last digit
*/
do {
temp = *p;
*p = *firstdig;
*firstdig = temp; /* swap *p and *firstdig */
--p;
++firstdig; /* advance to next two digits */
} while (firstdig < p); /* repeat until halfway */
}
Оно ?
--
С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru
З.Ы. Читайте исходники, товарищи !
Читайте классику !
Номер выпуска : 2800
Возраст листа : 199 (дней)
Количество подписчиков :
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/120677
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru
http://subscribe.ru/ mailto:ask@subscribe.ru