2012-06-30 11 views
7

Considere el siguiente código:¿Qué dice el estándar C sobre el cambio de bits más bits que el ancho de tipo?

int i = 3 << 65; 

yo esperaría que el resultado es i==0, sin embargo, el resultado real es i==6. Con algunas pruebas he encontrado que con el siguiente código:

int i, s; 
int a = i << s; 
int b = i << (s & 31); 

los valores de a y b son siempre los mismos.

¿El estándar C dice algo sobre el desplazamiento de más de 32 bits (el ancho del tipo int) o es este comportamiento no especificado?

Respuesta

12

Desde mi proyecto WG12/N1124 ( no la norma, pero lo suficientemente bueno para mí), está el siguiente bloque en 6.5.7 operadores de desplazamiento en modo bit:

Si el valor de la derecha el operando es negativo o es mayor o igual que el ancho del operando izquierdo promocionado, el comportamiento no está definido.

Por lo tanto, undefined. Ten cuidado.

+0

"Suficientemente bueno para mí": lo suficientemente bueno para todos, ya que el estándar contiene exactamente el mismo idioma. :-) Tenga en cuenta que también puede obtener C99 + TC3 gratis en http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf y también tiene el mismo idioma, por lo que incluso si usted no tiene el estándar en sí mismo, puede estar bastante seguro de lo que dice. –

+3

También puede obtener una versión html mucho más fácil de leer aquí: http://port70.net/~nsz/c/c99/n1256.html –

+0

@R .., oh, gracias, eso será mucho más fácil leer que el PDF. :) – sarnold

Cuestiones relacionadas