OT: Pregunta de C

Horst von Brand vonbrand en inf.utfsm.cl
Lun Nov 22 23:01:58 CLST 2004


"rodrigo ahumada" <rodahum1978 en hotmail.com> dijo:
> Horst von Brand <vonbrand en inf.utfsm.cl> dijo:
> >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:

[...]

> > > 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?)

Gana prrrremio el concurrrrsanteeeee!

Exacto, en maquinas big-endian sale al reves (y tampoco funciona en
maquinas de 64 bits, porque queda corto ;-).

Puede retirar su premio, suficiente Obfuscated C Contest para un an~o de
insania, via Google.

Felicitaciones!

[No, big-endian no tiene ventajas frente a little-endian. Ver los viajes de
 Guliver para detalles.]
-- 
Dr. Horst H. von Brand                   User #22616 counter.li.org
Departamento de Informatica                     Fono: +56 32 654431
Universidad Tecnica Federico Santa Maria              +56 32 654239
Casilla 110-V, Valparaiso, Chile                Fax:  +56 32 797513


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