mirada a este código de ejemplo C (extraído de un caso de prueba como ejemplo):No se puede entender el comportamiento del operador de desplazamiento en el código C
main() {
unsigned long a, b;
int c;
c = 32;
a = 0xffffffff << 32;
b = 0xffffffff << c;
printf ("a=%x, b=%x\n", a, b);
}
Lienzo: a=0, b=ffffffff
No puedo entender por qué B no es cero, solo como a. Probé esto en Microsoft C y GCC.
actualización: He arreglado el error tipográfico estúpida (debería haber sido < < C y no < < b por supuesto). Pero mi pregunta sigue en pie, p. el resultado sigue siendo el mismo
Downvoter, ¿podrías explicar por qué bajaste tu voto? – ouah
Ofreces una buena cantidad de detalles para la parte a de la pregunta, pero nada para explicar la parte b. – BitBank
@BitBank porque la parte 'a' y la parte' b' es el mismo problema (se realiza el mismo desplazamiento a la izquierda) con la misma explicación. Ambas expresiones en el RHS de la asignación de 'a' y' b' son un comportamiento indefinido. Como es un comportamiento indefinido, el resultado de 'a' y' b' puede ser el mismo o puede ser diferente o el programa puede 'rm -rf' la partición raíz. Por supuesto, podemos observar diferentes heurísticas de compilación porque en este primer caso se usa una constante como el operando correcto del cambio, pero esto es irrelevante. – ouah