2010-09-13 23 views
8

Cercare di chiarire qualcosa.Spostamenti bit a bit logici e aritmetici

rimane inteso che per quanto riguarda aritmetici, logici turni bit a bit:

  1. << lavoro uguali per entrambi
  2. >> spostamenti differisce dal fatto spostamento logico sarà sempre pad byte con 0, mentre spostamento aritmetico lo riempirà con il bit del segno.

Come posso differenziare questo utilizzando C?

Da quello che ho capito, gli operatori attuali sono gli stessi <<, >>

Come avrebbe comandato differiscono tra:

int i=1; 
printf ("%d\n", i >> 1); // logical shift 

int j=1; 
printf ("%d\n", j >> 1); // arithmetical shift 

prega fatemelo sapere,

risposta

13

In caso di numeri non negativi, sia i tipi di turni di destra sono gli stessi. La differenza appare solo quando il numero da spostare è negativo.

In realtà lo standard C non specifica quando deve >> eseguire lo spostamento logico o aritmetico quando il numero è negativo, ma in genere esegue lo spostamento aritmetico. Per eseguire lo spostamento logico, il numero deve essere convertito nel corrispondente tipo senza segno, for example:

int x = -2; 
int y = x >> 1; // arithmetic shift. 
assert (y == -1); 
int z = (unsigned)x >> 1; // logical shift. 
assert (z == 0x7FFFFFFF); 
+0

C'è un modo per forzare un particolare turno. Ad esempio, mi piacerebbe (x <<1)>> 1 per rilasciare il segno "-" – JAM

+0

@Jerry, @mac: vedere l'aggiornamento – kennytm

+1

@mac: scartare il bit del segno non è lo stesso che prendere l'assoluto valore nel complemento a due: – jamesdlin

Problemi correlati