2012-08-06 21 views
5

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?

Respuesta

7

Cambiar el valor de 32 bits por 32 bits es un comportamiento indefinido en C. No lo hagas.

+0

http://catb.org/jargon/html/N/nasal-demons.html –

6

Ambos son un comportamiento indefinido, ya que la distancia de desplazamiento debe ser menor que el ancho de bit del tipo. Con la constante, el optimizador de gcc hace lo que espera, pero con la variable, el cambio se realiza en tiempo de ejecución. Probablemente la distancia de cambio se enmascara con 31, por lo que no se realiza ningún cambio y 1 - 1 == 0.

Cuestiones relacionadas