Duplicar posible:
GCC left shift overflowinesperado izquierda turno comportamiento
Considere el siguiente programa mínimo.
#include <stdint.h>
#include <stdio.h>
int main()
{
uint32_t v = 1024;
v &= (((uint32_t)1 << 32) - 1);
printf("v = %u\n", v);
return 0;
}
Esto imprime 1024
como yo espera que la compilación con GCC bajo MinGW. Porque 1 desplazado 32 veces hacia la izquierda es 0 nuevamente, por lo tanto 0-1 = -1 que es "1111 .... 1111". Este AND'ed con cualquier valor debería devolver el mismo valor nuevamente.
Sin embargo, si cambio el programa de
#include <stdint.h>
#include <stdio.h>
int main()
{
unsigned int s = 32;
uint32_t v = 1024;
v &= (((uint32_t)1 << s) - 1);
printf("v = %u\n", v);
return 0;
}
El resultado impreso es ahora 0
. ¿Alguien puede explicar este comportamiento?
http://catb.org/jargon/html/N/nasal-demons.html –