AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77900622
Accepted
zorleone
zorleone
Asked: 2024-01-29 22:59:23 +0800 CST2024-01-29 22:59:23 +0800 CST 2024-01-29 22:59:23 +0800 CST

As macros endianness C23 podem ser usadas para determinar o layout de um campo de bits?

  • 772

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__?

c
  • 4 4 respostas
  • 72 Views

4 respostas

  • Voted
  1. KamilCuk
    2024-01-29T23:06:52+08:002024-01-29T23:06:52+08:00

    As macros endianness C23 podem ser usadas para determinar o layout de um campo de bits?

    Não

    Isso significa que o layout de um campo de bits pode ser qualquer, independentemente do valor de __STDC_ENDIAN_NATIVE__?

    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.

    • 3
  2. gulpr
    2024-01-29T23:10:17+08:002024-01-29T23:10:17+08:00

    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.

    • 2
  3. Best Answer
    Lundin
    2024-01-30T00:08:08+08:002024-01-30T00:08:08+08:00

    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:

    #include <stdio.h>
    
    typedef struct
    {
      unsigned bit:1;
    } bit_t;
    
    int main (void)
    {
      bit_t bit = { .bit=1 };
      unsigned char* byte = (unsigned char*)&bit;
    
      if(*byte & 0x01)
      {
        puts("bit = LSB");
      }
      else if(*byte & 0x80)
      {
        puts("bit = MSB");
      }
      else
      {
        puts("Completely broken compiler.")
      }
    }
    

    Eu tentei para vários alvos no Compiler Explorer:

    bit = LSB:

    • x86_64 (gcc/clang/icc/msvc)
    • ARM32 (gcc)
    • ARM64 (gcc)
    • Power64le (clang)
    • AVR (gcc)

    bit = MSB:

    • MIPS64 (gcc/clang)
    • Potência (gcc)
    • 0
  4. Ian Abbott
    2024-01-30T01:44:18+08:002024-01-30T01:44:18+08:00

    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:

    2
    3
    

    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:

    struct {
        unsigned foo:20;
        unsigned bar:12;
    };
    

    Existem quatro possibilidades de endian/armazenamento:

    1. Little-endian, compactado do bit 0 para cima da unidade de armazenamento endereçável:

      | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
      +---------------------------------------------------------------+
      |              Addressable Storage Unit (32 bits)               |
      |0             0 0             1 1     1 2     2 2             3|
      |0             7 8             5 6     9 0     3 4             1|
      +---------------+---------------+---------------+---------------+
      |     Byte 0    |     Byte 1    |     Byte 2    |     Byte 3    |
      |0             7|0             7|0     3 4     7|0             7|
      +---------------+---------------+-------+-------+---------------+
      |             foo (20 bits)             |     bar (12 bits)     |
      |0             0 0             1 1     1|0     0 0             1|
      |0             7 8             5 6     9|0     3 4             1|
      +---------------------------------------+-----------------------+
      | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
      
    2. Little-endian, compactado do bit 31 para baixo da unidade de armazenamento endereçável:

      | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
      +---------------------------------------------------------------+
      |              Addressable Storage Unit (32 bits)               |
      |0             0 0     1 1     1 1             2 2             3|
      |0             7 8     1 2     5 6             3 4             1|
      +---------------+---------------+---------------+---------------+
      |     Byte 0    |     Byte 1    |     Byte 2    |     Byte 3    |
      |0             7|0     3 4     7|0             7|0             7|
      +---------------+-------+-------+---------------+---------------+
      |     bar (12 bits)     |             foo (20 bits)             |
      |0             0 0     1|0     0 0             1 1             1|
      |0             7 8     1|0     3 4             1 2             9|
      +-----------------------+---------------------------------------+
      | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
      
      
    3. Big-endian, compactado do bit 0 para cima da unidade de armazenamento endereçável:

      | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
      +---------------------------------------------------------------+
      |              Addressable Storage Unit (32 bits)               |
      |3             2 2     2 1     1 1             0 0             0|
      |1             4 3     0 9     6 5             8 7             0|
      +---------------+---------------+---------------+---------------+
      |     Byte 0    |     Byte 1    |     Byte 2    |     Byte 3    |
      |7             0|7     4 3     0|7             0|7             0|
      +---------------+-------+-------+---------------+---------------+
      |     bar (12 bits)     |             foo (20 bits)             |
      |1             0 0     0|1     1 1             0 0             0|
      |1             4 3     0|9     6 5             8 7             0|
      +-----------------------+---------------------------------------+
      | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
      
    4. Big-endian, compactado do bit 31 para baixo da unidade de armazenamento endereçável:

      | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
      +---------------------------------------------------------------+
      |              Addressable Storage Unit (32 bits)               |
      |3             2 2             1 1     1 1     0 0             0|
      |1             4 3             6 5     2 1     8 7             0|
      +---------------+---------------+---------------+---------------+
      |     Byte 0    |     Byte 1    |     Byte 2    |     Byte 3    |
      |7             0|7             0|7     4 3     0|7             0|
      +---------------+---------------+-------+-----------------------+
      |             foo (20 bits)             |     bar (12 bits)     |
      |1             1 1             0 0     0|1     0 0             0|
      |9             2 1             4 3     0|1     8 7             0|
      +---------------------------------------+-----------------------+
      | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
      
    • 0

relate perguntas

  • Multiplicação mais rápida que *

  • Usando uma macro para comprimento de string no especificador de formato scanf () em C

  • Como você pode definir o tipo de dados de #define para long double?

  • Ponteiros const incompatíveis

  • Mudança de cor não gradual no OpenGL

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve