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