Ir para o conteúdo

Última atualização:2026-10-12

Ordem de bytes (endian) no C++20

Em entrevistas, a ordem de bytes costuma ser um ponto muito importante, que costuma abordar:

  • Conceitos de big-endian e little-endian
  • Como determinar big-endian ou little-endian
  • Ordem de bytes do host
  • Ordem de bytes de rede
  • etc.

Há, na verdade, muitas formas de fazer essa distinção, por exemplo:

  • endian do C++20
  • union
  • Conversão de endereço
  • htons

Nesta seção, abordaremos o uso e os fundamentos de big-endian/little-endian no C++20.

Obs.: versão para quem tem pressa, o código-fonte com as 4 formas de detecção de big-endian/little-endian já está no Planeta; adquira-o se tiver interesse.

1.Fundamentos de ordem de bytes

A ordem de bytes de um sistema refere-se à ordem em que os bytes são armazenados na memória ou transmitidos pela rede. Sistemas big-endian armazenam o byte mais significativo (MSB) no menor endereço de memória. Isso é usado em vários protocolos de rede para enviar dados pela rede, sendo também chamado de ordem de bytes de rede. Em sistemas little-endian, o byte menos significativo (LSB) é armazenado no menor endereço de memória. Por exemplo, o número hexadecimal 0x12345678 é armazenado assim:

  • Big-endian:
地址     | 值

n       | 0x12
n + 1   | 0x34
n + 2   | 0x56
n + 3   | 0x78
  • Little-endian
地址    | 值

n       | 0x78
n + 1   | 0x56
n + 2   | 0x34
n + 3   | 0x12

Dependendo da arquitetura, sistemas diferentes podem ter ordem de bytes de host big-endian ou little-endian.

2.A importância da ordem de bytes

Por que isso é importante? Se você precisa enviar dados pela rede, é preciso garantir que eles sejam transmitidos na ordem de bytes de rede. Na maioria dos casos, a ordem de bytes do seu host será little-endian, o que significa que você precisará inverter a ordem dos bytes antes de transmitir os dados.

3.Verificação da ordem de bytes

O C++20 introduziu uma forma mais simples e mais portátil de verificar a ordem de bytes: std::endian. Você pode usar std::endian::native para verificar a ordem de bytes do host do sistema. A seguir, um exemplo simples:

void checkEndianness() {
  if constexpr (std::endian::native == std::endian::little) {
    std::cout << "小端" << std::endl;
  } else if constexpr (std::endian::native == std::endian::big) {
    std::cout << "大端" << std::endl;
  } else {
    std::cout << "未知" << std::endl;
  }
}

Tópicos relacionados

Comentários