Ú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:
- Little-endian
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¶
- Introdução às corrotinas no C++20 | C++那些事
- Prática com channel no C++20 | C++那些事
- Concepts (conceitos) no C++20 | C++那些事
- constexpr e a expressão vírgula no C++20 | C++那些事
- Expressões Lambda no C++20 (parte 1) | C++那些事
- Módulos (Modules) no C++20 | C++那些事
- Biblioteca Ranges do C++20 | C++那些事
- Design e armadilhas do std::span no C++20 | C++那些事
- Guia dos novos recursos do C++20 | C++那些事
- [[likely]] e [[unlikely]] no C++20 | C++那些事