2010-09-13 10 views
8

Tratando de aclarar algo.Desplazamientos lógicos, aritméticos en bits

es mi entendimiento de que, con respecto a aritméticas, los cambios a nivel de bits lógicos:

  1. << funcionan de la misma para ambos
  2. >> turnos diferencian en que desplazamiento lógico será siempre byte de relleno con 0, mientras turno aritmética lo rellenará con el bit de signo.

¿Cómo puedo diferenciar esto usando C?

Por lo que entiendo, los operadores reales son los mismos <<, >>

¿Cómo comandos difieren entre:

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

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

por favor hágamelo saber,

Respuesta

13

En caso de números no negativos, tanto tipos de cambios a la derecha son lo mismo. La diferencia aparece solo cuando el número para cambiar es negativo.

En realidad, el estándar C no especifica cuándo debe >> realizar un desplazamiento lógico o aritmético cuando el número es negativo, pero normalmente realiza un desplazamiento aritmético. Para llevar a cabo desplazamiento lógico, el número se debe convertir al tipo sin signo correspondiente, 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

¿Hay una manera de forzar un cambio en particular. Por ejemplo, me gustaría (x <<1)>> 1 para soltar el signo "-". – JAM

+0

@Jerry, @mac: Ver actualización. – kennytm

+1

@mac: Descartar el bit de signo no es lo mismo que tomar el valor absoluto valor en el complemento de dos. – jamesdlin

Cuestiones relacionadas