¿Cómo afecta el bit endianness a los cambios de bit a bit y al archivo IO en C?

Sean L y B dos máquinas. L ordena sus bits de LSB (bit menos significativo) a MSB (bit más significativo) mientras que B ordena de MSB a LSB. O, en otras palabras, L usa Little Endian mientras que B usa el bit Big Endian, no debe confundirse con el ordenamiento de bytes.

Problema 1 RESUELTO :

Estamos escribiendo el siguiente código que queremos que sea portátil:

#include  int main() { unsigned char a = 1; a <<= 1; printf("a = %d\n", (int) a); return 0; } 

en L , imprimirá 2, pero ¿qué pasa en B ? ¿Cambiará el 1 e imprimirá 0?

SOLUCIÓN: La definición de C99 en 6.5.7 dice que, al menos en los tipos enteros sin signo, << y >> se multiplicarán y dividirán por 2 respectivamente.

Problema 2:

Estamos escribiendo el siguiente código que queremos que sea portátil:

Progtwig de lectura:

 /* program READ */ #include  int main() { FILE* fp; unsigned char a; fp = fopen("data.dat", "rb"); fread(&a, 1, 1, fp); fclose(fp); return 0; } 

y el progtwig de ESCRITURA:

 /* program WRITE */ #include  int main() { FILE* fp; unsigned char a = 1; fp = fopen("data.dat", "wb"); fwrite(&a, 1, 1, fp); fclose(fp); return 0; } 

¿Qué sucede si ejecutamos WRITE en L , movemos el archivo de datos a B y ejecutamos LEER allí? ¿Y si ejecutamos ESCRIBIR en B y luego LEER en L ?

Lo siento si esto es un FAQ. Busqué en Google durante horas sin suerte.

Bit Endianness no afecta a los datos almacenados en discos en bytes. Byte endianness lo hará.

Bit Endianness es algo que importa para las interfaces seriales donde se envía un byte bit a bit, y el remitente y el receptor deben ponerse de acuerdo sobre el orden de los bytes. Por ejemplo, el orden de los bits en los dispositivos SPI varía y debe hacer referencia a la hoja de datos antes de intentar leer desde el dispositivo.

Esto es lo que Wikipedia dice en bit endianness:

Los términos endianness de bit o endianness de nivel de bit rara vez se usan cuando se habla de la representación de un valor almacenado, ya que solo son significativos para las architectures informáticas raras donde cada bit individual tiene una dirección única. Sin embargo, se utilizan para referirse al orden de transmisión de bits en un medio en serie. En la mayoría de los casos, ese orden es administrado de manera transparente por el hardware y es el análogo de nivel de bit de little-endian (primero el bit bajo), aunque existen protocolos que requieren la ordenación opuesta (por ejemplo, I²C). En las redes, la decisión sobre el orden de transmisión de los bits se toma en la parte inferior de la capa de enlace de datos del modelo OSI.

En su caso, la interfaz del disco duro físico define el orden de los bits, independientemente del procesador que vaya a leerlo o escribirlo.

Realmente no existe tal cosa como bit-endianness, al menos en lo que concierne a C. CHAR_BIT tiene que tener al menos 8 según la especificación, por lo que el acceso a cualquier objeto más pequeño que eso no tiene ningún significado para un progtwig C estándar. Independientemente de cómo el hardware almacena un byte (LSB o MSB primero), no afecta en absoluto a su progtwig. myVar & 1 devuelve el bit correcto en cualquier caso.

Si necesita interactuar con algún tipo de interfaz en serie y reconstituir bytes desde ella, esa es una historia diferente. La ‘bit-endianness’ de su propia máquina todavía no afecta a nada, pero el orden de bits de la interfaz sí lo hace.

Ahora, en cuanto a su pregunta específica y el progtwig que ha mostrado. Sus progtwigs son casi 100% portátiles. Ni los bitios ni los bytes los afectan. Lo que podría afectarlos es si CHAR_BIT fuera diferente en cada plataforma. Una computadora podría escribir más datos de los que la otra leería, o viceversa.

Los >> (y << ) no empujan (tiran) los bits hacia la derecha (o hacia la izquierda).
Se dividen (o multiplican) por 2.

Para todos los cuidados del comstackdor, los bits se pueden astackr verticalmente :)

El cambio de bits no se ve afectado por la endianidad. La E / S de archivos binarios normalmente es, pero no en su caso, ya que solo está escribiendo un solo byte.

El endianness no lo afectará a menos que a) lea algo de la memoria usando un tipo diferente al que usó para escribirlo, o si leyó algo de un archivo que fue escrito con una máquina que usa un endianness diferente.

es decir

 int data; char charVal; *data = 1; charval = *((char *) data); // Different result based on endianness 

O su ejemplo dos, asumiendo que está usando un tipo más grande que char.