Guardate questo codice di esempio C (estratto un test come esempio):non comprendere il comportamento operatore di spostamento nel codice C
main() {
unsigned long a, b;
int c;
c = 32;
a = 0xffffffff << 32;
b = 0xffffffff << c;
printf ("a=%x, b=%x\n", a, b);
}
stampe: a=0, b=ffffffff
non riesco a capire perché b non è zero, proprio come a. Ho provato questo su Microsoft C e GCC.
Aggiornamento: ho fissato l'errore di battitura stupido (che avrebbe dovuto essere < < C e non < < b ovviamente). Ma la mia domanda rimane valida, ad es. il risultato è sempre lo stesso.
Downvoter, potresti spiegare perché hai downvoted? – ouah
Offri una buona quantità di dettagli per la parte a della domanda, ma nulla per spiegare la parte b. – BitBank
@BitBank perché la parte 'a' e la parte' b' è lo stesso problema (lo stesso spostamento a sinistra viene eseguito) con la stessa spiegazione. Entrambe le espressioni nel RHS dell'assegnazione di 'a' e' b' sono comportamenti indefiniti. Poiché è un comportamento indefinito, il risultato di 'a' e' b' può essere lo stesso o può essere diverso o il programma può 'rm -rf' la partizione di root. Naturalmente, possiamo osservare differenti euristiche di compilazione perché in questo primo caso viene utilizzata una costante come operando corretto del turno, ma ciò è irrilevante. – ouah