Sólo para ampliar la respuesta de Marc un poco (Marc, no dude en incluir esto en la suya y voy a borrar esta respuesta) esto se especifica en el apartado 7.8 de la especificación:
El los operadores de turnos predefinidos se enumeran a continuación.
Shift izquierda:
- operador int < < (int x, int count);
- uint operator < < (uint x, int count);
- operador largo < < (largo x, recuento int);
- ulong operator < < (ulong x, int count);
El operador < < se desplaza x dejando una cantidad de bits calculados como se describe a continuación.
Los bits de orden superior fuera del rango del tipo de resultado de x se descartan, los bits restantes se desplazan hacia la izquierda y las posiciones de bits vacíos de orden inferior se ponen a cero.
Shift derecha:
- operador int >> (int x, int count);
- uint operator >> (uint x, int count);
- operador largo >> (largo x, recuento int);
- ulong operator >> (ulong x, int count);
El operador >> se desplaza x en la derecha por una serie de bits calculados como se describe a continuación.
Cuando x es de tipo int o largo, los bits de orden inferior de x se descartan, los bits restantes se desplazan a la derecha y las posiciones de bits vacías de alto orden se ponen a cero si x no es negativo y se establecen a uno si x es negativo.
Cuando x es de tipo uint o ulong, los bits de orden inferior de x se descartan, los bits restantes se desplazan hacia la derecha y las posiciones de bits vacías de orden superior se ponen a cero.
Para los operadores predefinidos, el número de bits a desplazar se calcula como sigue:
Cuando el tipo de x es int o uint, el valor de desplazamiento es dada por el bajo orden de cinco bits de recuento. En otras palabras, el recuento de turnos se calcula a partir del recuento & 0x1F.
Cuando el tipo de x es largo o largo, la cuenta de turno está dada por los seis bits de bajo orden de conteo. En otras palabras, el recuento de turnos se calcula a partir del recuento & 0x3F.
Si el recuento de turnos resultante es cero, los operadores de turno simplemente devuelven el valor de x.
Hola, ¿puedo pedirte que lo expliques más? En la primera, ¿por qué tengo 0x200000000 y en la segunda, por qué tengo 16000? muchas gracias –
Eso es como decir "por qué es 1 * 50000 diferente a 1000 * 8" - porque estás haciendo cosas muy diferentes. El primero es 2^33 ("potencia de"), el segundo es 1000 * 16. –
bien entiendo la diferencia entre 2^33 y 1000 * 16 quiero saber por qué 2^32 –