2010-11-17 4 views
39

yo soy muy nuevo para tratar con los bits y que se ha pegado en la siguiente advertencia al compilar:advertencia: a la izquierda valor de desplazamiento> = anchura del tipo

7: warning: left shift count >= width of type 

Mi línea 7 se parece a esto

unsigned long int x = 1 << 32; 

Esto tendría sentido si el tamaño de long en mi sistema era de 32 bits. Sin embargo, sizeof(long) devuelve 8 y CHAR_BIT se define como 8 sugiriendo que largo debe ser 8x8 = 64 bits de largo.

¿Qué me falta aquí? ¿Son sizeof y CHAR_BIT inexactos o he entendido mal algo fundamental?

Respuesta

63

long puede ser un tipo de 64 bits, pero 1 es todavía un int. Es necesario hacer 1 un long int usando el sufijo L:

unsigned long x = 1UL << 32; 

(Usted también debe facilitarle unsigned usando el sufijo U como he mostrado, para evitar los problemas de la izquierda cambiando un entero con signo No hay ningún problema. cuando un long es de 64 bits de ancho y cambio por 32 bits, pero sería un problema si cambiaste 63 bits)

+0

Would 'sin signo de largo x = 1; x << = 32; 'trabajo, ¿por interés? –

+0

@Kolink: Sí, eso tendría el mismo efecto, como '' (sin signo largo) 1 << 32' El operando izquierdo solo tiene que ser un 'unsigned long'. El sufijo 'UL' es simplemente la forma más directa de lograr eso. –

+0

@James McNellis: ¿Cuáles son los * problemas de __left__ cambiando un número entero con signo *? Solo sé que *** *** *** cambiando un entero con signo puede llevar a resultados diferentes con diferentes compiladores. – pynexj

1

unsigned long x = 1UL < < 31;

No se muestra el mensaje de error. Porque antes de especificar el 32, no es cierto porque solo se limita a 0-31.

0

No se puede cambiar un valor a su máxima de bits

int x;   // let int be 4 bytes so max bits : 32 
x <<= 32; 

lo tanto, esto genera la advertencia

left shift count >= width of type (i.e type = int = 32)

+0

Su redacción es incorrecta. Usted ** puede ** cambiar un '1' al bit más significativo de su tipo, si está' unsigned' o si 'signed' y tiene' INT_MIN == 1 << width - 1'. Está cambiando * más allá * de la parte más alta que puede causar problemas. –

8

unsigned long es de 32 bits o 64 bits, que depende de su sistema. unsigned long long siempre es de 64 bits. Debe hacerlo de la siguiente manera:

unsigned long long x = 1ULL << 32 
+1

IOW, es el tamaño de la constante 1 lo que le da problemas, no x. – deStrangis

-1

se puede usar algo así:

unsigned long x = 1; 
x = x << 32; 
Cuestiones relacionadas