Supongamos que tengo el número 'numb'=1025 [00000000 00000000 00000100 00000001]
representado:
En la máquina Little-Endian:
00000001 00000100 00000000 00000000
En la máquina Big-Endian:
00000000 00000000 00000100 00000001
Ahora, si aplico el Desplazamiento a la izquierda en 10 bits (es decir: entumecido << = 10), debería tener:
[A] En la máquina Little-Endian:
Como noté en GDB, Little Endian realiza el Desplazamiento a la izquierda en 3 pasos: [He mostrado '3' Pasos para comprender mejor solo el procesamiento]
Trata el no. en la Convención Big-Endian:
00000000 00000000 00000100 00000001
Aplicar desplazamiento a la izquierda:
00000000 00010000 00000100 00000000
Representa el resultado nuevamente en Little-Endian:
00000000 00000100 00010000 00000000
[SI]. En la máquina Big-Endian:
00000000 00010000 00000100 00000000
Mi pregunta es:
Si aplico directamente un Desplazamiento a la 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 lograr el segundo resultado solamente, he mostrado tres pasos hipotéticos arriba.
Explíqueme por qué los dos resultados anteriores son diferentes: el resultado real de numb << 10
es diferente del resultado esperado.
fuente
No, el desplazamiento de bits, como cualquier otra parte de C, se define en términos de valores , no representaciones. El desplazamiento a la izquierda por 1 es la multiplicación por 2, el desplazamiento a la derecha es la división. (Como siempre cuando se utilizan operaciones bit a bit, tenga cuidado con la firma. Todo está más bien definido para los tipos integrales sin signo).
fuente
x &= -1u << 20
lo más probable es que sea incorrecto six
es de 64 bits y deint
32 bits. Por esta razón, GCC promete nunca tratar los turnos firmados como indefinidos o incluso no especificados.Cualquier instrucción de desplazamiento desplaza primero los bits de orden superior se considera desplazamiento a la izquierda. Cualquier instrucción de desplazamiento desplaza primero los bits de orden inferior se considera el desplazamiento correcto. En ese sentido, el comportamiento de
>>
y<<
para losunsigned
números no dependerá de la resistencia.fuente
Las computadoras no escriben números como nosotros. El valor simplemente cambia. Si insiste en mirarlo byte por byte (aunque no es así como lo hace la computadora), podría decir que en una máquina little-endian, el primer byte se desplaza hacia la izquierda, el exceso de bits va al segundo byte, y así.
(Por cierto, little-endian tiene más sentido si escribe los bytes verticalmente en lugar de 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).
fuente
Aunque la respuesta aceptada señala que la resistencia es un concepto desde el punto de vista de la memoria. Pero no creo que eso responda la pregunta directamente.
Algunas respuestas me dicen que las operaciones bit a bit no dependen de la resistencia , y el procesador puede representar los bytes de cualquier otra manera. De todos modos, se habla de que la endianess se abstrae.
Pero cuando hacemos algunos cálculos bit a bit en el papel, por ejemplo, ¿no es necesario indicar la resistencia en primer lugar? La mayoría de las veces elegimos un endianess implícitamente.
Por ejemplo, supongamos que tenemos una línea de código como esta
0x1F & 0xEF
¿Cómo calcularías el resultado a mano, en un papel?
Así que aquí usamos un formato Big Endian para hacer el cálculo. También puede usar Little Endian para calcular y obtener el mismo resultado.
Por cierto, cuando escribimos números en código, creo que es como un formato Big Endian.
123456
o0x1F
, los números más significativos comienzan desde la izquierda.Nuevamente, tan pronto como escribimos un formato binario de un valor en el papel, creo que ya elegimos un Endianess y estamos viendo el valor tal como lo vemos desde la memoria.
Volviendo a la pregunta, una operación de cambio
<<
debe considerarse como un cambio de LSB (byte menos significativo) a MSB (byte más significativo) .Entonces, como para el ejemplo en la pregunta:
numb=1025
Little Endian
LSB 00000001 00000100 00000000 00000000 MSB
Entonces
<< 10
estaría10bit
cambiando de LSB a MSB.Comparación y
<< 10
operaciones para el formato Little Endian paso a paso:¡Guauu! ¡Obtuve el resultado esperado como lo describió el OP!
Los problemas que el OP no obtuvo el resultado esperado son que:
Parece que no cambió de LSB a MSB.
Al cambiar bits en formato Little Endian, debes darte cuenta (gracias a Dios, me doy cuenta) de que:
LSB 10000000 00000000 MSB << 1
esLSB 00000000 00000001 MSB
, noLSB 01000000 00000000 MSB
Porque para cada individuo
8bits
, en realidad lo estamos escribiendo enMSB 00000000 LSB
formato Big Endian.Entonces es como
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
Para resumir:
Aunque se dice que las operaciones bit a bit se abstraen de blablablabla ..., cuando calculamos las operaciones bit a mano, todavía necesitamos saber qué endianess estamos utilizando a medida que escribimos el formato binario en el papel. También debemos asegurarnos de que todos los operadores usen la misma resistencia.
El OP no obtuvo el resultado esperado porque hizo mal el cambio.
fuente