Hola a todos, estamos desarrollando un motor de ajedrez en el cual para hacer los movimientos de las piezas usamos corrimientos de bits o bitshifts. El problema es que cuando se hace el computo de 1<<38, este arroja como resultado 0x40 debiendo ser 0x4000000000. El segmento de código es el siguiente:
int power=38;
unsigned long auxtab=0;
auxtab=(1<<power);
printf("Prueba: %x",auxtab);
Ojalá me puedan ayudar un poco. Muchas gracias.
sizeof(unsigned long) es 4. ¿No? El valor maximo que podes asignarle es 0xFFFFFFFF asi que si queres ese valor que pusiste tenes que usar una variable de mayor tamaño, fijate en tu compilador.
http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.80).aspx
si se usa unsigned long long que le sigue a unsigned long
Ya chequé y el tamaño de unsigned long me lo da como 8.
Alguna sugeencia?????
entonces seguramente tu maquina es de x64, si necesitas el 0x40000000 entonces el power debería sér 30d
Para verlo:
printf("Prueba: %I64x", auxtab);
Y lo podes calcular asi:
unsigned long long auxtab = 1;
auxtab <<= power;
O asi:
auxtab=((unsigned long long)1 << power);
PD. Puede que no necesites hacer el casting ni cambiar el tipo segun lo que comentas del tamaño de la variable, con lo del printf estaria solucionado.
Cita de: Eternal Idol en 10 Mayo 2012, 10:17 AM
Para verlo:
printf("Prueba: %I64x", auxtab);
Y lo podes calcular asi:
unsigned long long auxtab = 1;
auxtab <<= power;
O asi:
auxtab=((unsigned long long)1 << power);
PD. Puede que no necesites hacer el casting ni cambiar el tipo segun lo que comentas del tamaño de la variable, con lo del printf estaria solucionado.
El problema no es la impresión en pantalla del número hexadecimal, el problema radica en que el cálculo se está haciendo mal. Pasamos ese número hexadecimal a una función que imprime un tablero gráfico y el número está mal.
Ya hemos probado diferentes posibles soluciones pero no obtenemos que haga el cálculo correctamente, nos corta a 32 bits siendo que usamos el SO de 64 bits y además el compilador es gcc de 64 bits.
¿Alguna idea?
Bien, pero nunca lo iban a ver como corresponde con %X. Proba de calcularlo como motsre arriba y si sigue sin funcionar depura el programa para ver exactamente que esta haciendo.
PD. Vos estabas usando 1 y ese literal es un int, ponelo en una variable de 64 bits o hacele un casting al empujar.
Muchas gracias, es cierto, el problema es que estaba corriendo una variable de 32 bits por lo cual la cortaba en 32 bits. Ahora he usado el mismo auxtab igualado a 1 el cual es unsigned long en 64 bits.
El problema ha sido solucionado, pueden dar el tema por SOLUCIONADO. Muchas gracias a todos por sus respuestas.
De nadas ::)