OT: Pregunta de C

rodrigo ahumada rodahum1978 en hotmail.com
Lun Nov 22 17:26:07 CLST 2004


>From: Horst von Brand <vonbrand en inf.utfsm.cl>
>Reply-To: Discusion de Linux en Castellano <linux en listas.inf.utfsm.cl>
>To: Discusion de Linux en Castellano <linux en listas.inf.utfsm.cl>
>Subject: Re: OT: Pregunta de C Date: Mon, 22 Nov 2004 14:46:30 -0300
>
>Daniel Serpell <daniel_serpell en yahoo.com> dijo:
>
>[...]
>
> > Aunque no lo creas, todo compilador de C compatible con el estándar debe
> > tragarse lo siguiente, e incluso generar código válido:
> >
> > h(i) {
> >  return i["0123456789ABCDEF"];
>
>Obvio. a[i] == *(a + i) == *(i + a) == i[a]. Aca 'a' es el arreglo de
>caracteres (el string). Menos enredado es:
>
>    return "0123456789ABCDEF"[i];
>
>que hace exactamente lo mismo (y es igual de misterioso para el newbie ;-)
>
> > }
> >
> > char p[5];
> > char *hh(i) {
> >  p[4] = 0;
> >  p[3] = h(i&15);
> >  p[2] = h((i>>=4)&15);
> >  p[1] = h((i>>=4)&15);
> >  p[0] = h((i>>=4)&15);
> >  return p;
>
>Retorna el arreglo global 'p', que "magicamente" se transforma en puntero a
>su 0-esimo elemento cuando se le mira de frente. Como p[4] == '\0', esto es
>un string valido. La magia tonteando con bits transfiere 'i' un digito
>hexadecimal a la vez a 'p'.
>
> > }
> >
> > main() {
> >  int puts(char *);
> >  puts(hh(getpid()));
> > }
> >
> > Tarea para la casa: ¿por qué funciona?.
>
>Otra tarea: En que maquinas _no_ funciona? Porque?

supongo que la parte:
char p[5];
char *hh(i) {
p[4] = 0;
p[3] = h(i&15);
p[2] = h((i>>=4)&15);
p[1] = h((i>>=4)&15);
p[0] = h((i>>=4)&15);
return p;

no sirve en PPC y otros risc por ser big endian (¿tiene alguna ventaja ser 
asi?)

_________________________________________________________________
Consigue aquí las mejores y mas recientes ofertas de trabajo en América 
Latina y USA: http://latam.msn.com/empleos/



Más información sobre la lista de distribución Linux