You are on page 1of 2

C:\Keil\C51\Examples\hector\ITOA.

C /////////////////////////////////////////////////////////////////////////////////////// ///////// //Funciones para la transformacion de enteros a cadenas de caracteres //Autor: Hector Almeria Nuñez //Fecha: 04/03/2011 // //version: 1.0 //Para futuras modificaciones poner nombre, explicacion de la modificacion y linea (apr oximada). /////////////////////////////////////////////////////////////////////////////////////// ///////// char cadena [7]; //cadena usada para realizar los calculos //cabeceras de las funciones contenidas unsigned int atoi (char *cadena); char * itoa(unsigned int numero); char * htoa(unsigned int numero); unsigned int exp(unsigned int base, unsigned int exponente); char * itoa(unsigned int numero) //transforma un unsigned int en una cadena de caracter es (decimal). EJ: 128 -> "128" { unsigned int aux_num=1; unsigned char i=0, numero_de_cifras=0; if(numero>65535) numero=65535; //si es mas alto no puede ser un int, ademas se sal e de la cadena reservada if(numero==0) {cadena[0]='0'; cadena[1]='\0';} //si es 0 (muy habitual) no hago ca lculos, + rapido. else { //calcular el numero de cifras while(numero >= aux_num) {aux_num=aux_num*10; numero_de_cifras++;} //vamos rellenando la cadena cadena[numero_de_cifras]='\0'; //ponemos el final de la cadena for(i=0;i<numero_de_cifras;i++) { cadena[numero_de_cifras-i-1]='0' + numero%10; //sacamos el valor de digi to de menor peso, a partir de la direccion //base del caracter 0 numero=numero/10; //"desplazamos" a la derecha el numero para continuar con el siguiente digito } } return cadena; } char * htoa(unsigned int numero) //transforma un unsigned int en una cadena de caracte res (hexadecimal). EJ: 125 ó 0x7D -> "0x007D" { unsigned int aux_num=1; unsigned char i=0, aux=0; if(numero>65535) numero=65535; //si es mas alto no puede ser un int, ademas se sal e de la cadena reservada if(numero==0) {cadena[0]='0'; cadena[1]='x'; cadena[2]='0';cadena[3]='0';cadena[4] ='0';cadena[5]='0';cadena[6]='\0';} //si es 0 (muy habitual) no hago calculos, + rapido.(0 -> 0x0000) else { //vamos rellenando la cadena cadena[0]='0'; // "0x" cadena[1]='x'; cadena[6]='\0'; //ponemos el final de la cadena (6 es el numero de cifras -1) for(i=2;i<6;i++) //4 iteraciones, 4 digitos en hexadecimal, empieza en 2 porq Page: 1

i<n_cifras.n_cifras-1-i). unsigned int resultado=base.cadena[n_cifras]. } unsigned int atoi (char *cadena) { //transforma una cadena de caracteres en un unsigned int (Ej: "2345" -> 2345) unsigned char n_cifras. if(aux>9) { cadena[7-i]='A'+ aux-10. j=0.//si no es un numero. //'7' es el numero de cifras -1 } else cadena[7-i]='0' + aux. i=0.C ue 0 y 1 son el '0x' { aux=numero%16..) } } return numero.C:\Keil\C51\Examples\hector\ITOA.. error y devuelvo -1 else { numero=numero+(cadena[i]-'0')*exp(10. if(exponente==0) return 1. for(i=0. } unsigned int exp(unsigned int base. unsigned int exponente) { //calcula base elevado al exponente (ej: exp(2. //sacamos el valor de digito de menor peso. return resultado. //calculo la longitud de la cadena for(i=0. } Page: 2 .3) -> 2*2*2 unsigned char i=0. a partir de la direccion //base del caracter 0 numero=numero/16. unsigned int numero=0. for(n_cifras=0.i<exponente-1. //doy el valor del nume ro en funcion de su posicion (unidades.n_cifras++).i++) resultado=resultado*base. //"desplazamos" a la derecha el numero para continuar con el siguiente digito } } return cadena.i++) { if(cadena[i] > '9' || cadena[i] < '0') return -1. decenas.