Estive lendo sobre as novas adições ao padrão C e encontrei macros para determinar o endianness em tempo de compilação .
No entanto, a norma ainda afirma que
A ordem de alocação de campos de bits dentro de uma unidade (ordem superior para ordem inferior ou ordem inferior para ordem superior) é definida pela implementação .
Isso significa que o layout de um campo de bits pode ser qualquer, independentemente do valor de __STDC_ENDIAN_NATIVE__
?
Não
Sim.
Endianness de byte - a ordem dos bytes dentro das palavras - e endianness de bit - a ordem dos bits dentro de um byte - são separados.
Endianess só se aplica à ordem de bytes em tipos mais longos.
A ordem dos bits nos campos de bits não tem nada em comum com o endianismo.
A ordem dos bits não dependia do endianess em primeiro lugar. Mas sim, se o primeiro bit na estrutura for considerado MSB ou LSB. Por exemplo, alguns campos de bits específicos da implementação podem ter apenas 1 byte de tamanho.
O bom senso diz que o primeiro bit deveria ser MSB, na minha opinião, porque é assim que todos, exceto a IBM, enumeram os bits, do maior ao menor (7 a 0). Mas aparentemente a maioria das implementações o utiliza como LSB. Você pode tentar este exemplo:
Eu tentei para vários alvos no Compiler Explorer:
bit = LSB:
bit = MSB:
Tanto o endianness quanto a ordem de colocação de um membro de campo de bits dentro de uma unidade de armazenamento endereçável são definidos pela implementação, mas independentes.
Nota 1: nos diagramas da arte ASCII abaixo, os números de bits dentro de uma unidade de armazenamento endereçável, um membro de campo de bits (ou preenchimento) ou um byte foram escritos verticalmente. Por exemplo:
indica a posição do bit 23.
Nota 2: Nos diagramas little-endian, os números dos bits aumentam da esquerda para a direita. Nos diagramas big-endian, os números dos bits aumentam da direita para a esquerda.
Considere o seguinte tipo com dois campos de bits de tamanho 20 bits e 12 bits em uma única unidade de armazenamento endereçável de 32 bits e 4 bytes:
Existem quatro possibilidades de endian/armazenamento:
Little-endian, compactado do bit 0 para cima da unidade de armazenamento endereçável:
Little-endian, compactado do bit 31 para baixo da unidade de armazenamento endereçável:
Big-endian, compactado do bit 0 para cima da unidade de armazenamento endereçável:
Big-endian, compactado do bit 31 para baixo da unidade de armazenamento endereçável: