2015-07-21 4 views
11

Qual è il risultato del numero quando viene lasciato spostato da -1 in programmazione C utilizzando l'operatore di spostamento a sinistra ?Qual è il valore del numero di spostamento a sinistra di -1

es:

23 << -1 
+2

spostamento a sinistra con -1 sembra uno spostamento a destra con 1 – adricadar

+0

@adricadar: Sembra (ea volte vorrei che fosse), ma: Fondamentalmente sbagliato. – Olaf

+0

Nota: Poichè OP ha detto "numero", esiste un'altra restrizione: "Ciascuno degli operandi deve avere il tipo intero". – chux

risposta

9

Dal C11 norma 6.5.7p3 (per versioni precedenti è fondamentalmente lo stesso):

"Se il valore dell'operando destro è negativo o maggiore o uguale alla larghezza dell'operando sinistro promosso, il comportamento non è definito. "

IOW: undefined behaviour. Preparare per nasal demons.

In breve: Non

Attenzione: Mentre molti programmatori sono consapevoli di questo e evitare che i valori di spostamento negativo, è spesso ignorato che conta anche >= il bit-dimensione del valore sono anche indefinito. Questo rende qualcosa come ((unsigned int)1 << 32) - 1 effettivamente indefinito se unsigned int ha 32 bit o meno. Per i valori firmati le cose diventano more complicated a causa del segno (grazie a @chux per avermi indicato). Questo è un errore comune. Per alcune implementazioni, potrebbero verificarsi risultati diversi per le espressioni costanti (valutata in fase di compilazione) e la valutazione di runtime.

+1

Non è '((int) 1 << 31) - 1' anche indefinito se' int' ha 32 bit o meno? – chux

+0

@chux: aggiornato, grazie! – Olaf

0

sinistra bit a bit Maiusc Operatore in C:

  1. bit del modello dei dati può essere spostato da un numero specificato di posizioni a sinistra
  2. Quando i dati sono spostata a sinistra, zero finale di sono pieni di zero.
  3. L'operatore di spostamento a sinistra è operatore binario [Bi-two]
  4. Mezzi binari, operatore che richiede due argomenti!

Table

Sintassi:

**[variable]<<[number of places]** 

Se Numero di posti diventare negativo, sarà indefinito

1

Come ha detto Olaf nella sua risposta, sinistra spostando da un numero negativo è indefinito.

In effetti, gcc darà un avviso se si tenta di spostare in entrambe le direzioni da un numero negativo.

+3

"... gcc darà un avvertimento ...": ma solo se può rilevare il tempo di compilazione, cioè se il numero di turni è una costante come in la domanda. – Olaf

Problemi correlati