little - ¿El cambio de bit depende del endianness?
little endian and big endian pdf (4)
Cualquiera que sea la instrucción de desplazamiento que cambie los bits de orden superior primero se considera el desplazamiento a la izquierda. Cualquiera que sea la instrucción de desplazamiento que cambie los bits de orden inferior primero, se considera el desplazamiento correcto. En ese sentido, el comportamiento de >>
y <<
para números unsigned
no dependerá de la endianidad.
Supongamos que tengo el número ''numb''=1025 [00000000 00000000 00000100 00000001]
representado:
En Little-Endian Machine:
00000001 00000100 00000000 00000000
En Big-Endian Machine:
00000000 00000000 00000100 00000001
Ahora, si aplico Left Shift en 10 bits (es decir: entumecido << = 10), debería tener:
[A] En Little-Endian Machine:
Como noté en GDB, Little Endian hace el Shift Izquierdo en 3 pasos: [He mostrado ''3'' Pasos para comprender mejor el procesamiento solamente]
Trata el no. en la Convención Big-Endian:
00000000 00000000 00000100 00000001
Aplicar a la izquierda-Shift:
00000000 00010000 00000100 00000000
Representa el resultado nuevamente en Little-Endian:
00000000 00000100 00010000 00000000
[SEGUNDO]. En Big-Endian Machine:
00000000 00010000 00000100 00000000
Mi pregunta es:
Si aplico directamente un Turno de izquierda en la Convención Little Endian, debería dar:
numb
00000001 00000100 00000000 00000000
numb << 10
:
00010000 00000000 00000000 00000000
Pero en realidad, da:
00000000 00000100 00010000 00000000
Para alcanzar el segundo resultado solamente, he mostrado tres pasos hipotéticos arriba.
Explique por qué los dos resultados anteriores son diferentes: el resultado real de numb << 10
es diferente del resultado esperado.
Endianness es la forma en que los valores se almacenan en la memoria. Cuando se carga en el procesador, independientemente de la endiancia, la instrucción de cambio de bit está operando en el valor en el registro del procesador. Por lo tanto, cargar de la memoria al procesador es el equivalente de convertir a big endian, la operación de cambio viene después y luego el nuevo valor se almacena de nuevo en la memoria, que es donde vuelve a entrar en vigencia el pequeño orden de bytes endian.
Actualización, gracias a @jww: en PowerPC el vector cambia y gira son sensibles a Endian. Puede tener un valor en un registro vectorial y un cambio producirá resultados diferentes en little-endian y big-endian .
Las computadoras no escriben números de la manera en que lo hacemos. El valor simplemente cambia. Si insiste en mirarlo byte a byte (aunque no sea así como lo hace la computadora), podría decirse que en una máquina little-endian, el primer byte se desplaza hacia la izquierda, el exceso de bits ingresa al segundo byte, y así.
(Por cierto, little-endian tiene más sentido si se escriben los bytes verticalmente que horizontalmente, con direcciones más altas en la parte superior. Lo que sucede es cómo se dibujan comúnmente los diagramas de mapas de memoria).
No, bitshift, como cualquier otra parte de C, se define en términos de valores , no representaciones. El desplazamiento a la izquierda en 1 es mutliplicación en 2, el desplazamiento a la derecha es división. (Como siempre, al usar operaciones a nivel de bits, tenga cuidado con la firma. Todo está mejor definido para los tipos integrales sin signo).