OT: Pregunta de C

Daniel Serpell daniel_serpell en yahoo.com
Mar Nov 23 11:07:02 CLST 2004


Hola!

El Mon, Nov 22, 2004 at 11:01:58PM -0300, Horst von Brand escribio:
> "rodrigo ahumada" <rodahum1978 en hotmail.com> dijo:
> > 
> > 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 ;-).

En realidad, el código en cuestión funciona tanto en big-endian como
en little-endian, ya que nunca accede a un entero a travez de un
puntero a otro tipo de dato, ni usa tipos union.

La parte "i&15" entrega siempre los mismos 4 últimos bits de un número,
ya que es la constante "15" la que cambia de representación en memoria,
pero en el código es la misma. Idem el resto.

Con respacto a los 64 bits, el código funciona mientras "i" sea menor
a 2147483648 y mayor o igual a -2147483648. Fuera de ese rango, entrega
el resultado de "i % 2147483647" en hexadecimal. Y tuve especial cuidado
en nunca convertir punteros a int para que funcionara :-)

        Daniel.



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