Provavelmente, muitos programadores C++ já se depararam com certas dúvidas relacionadas ao operador sizeof. Se ainda não aconteceu com você, quem sabe este post evite potenciais dores de cabeça. Mas mesmo se tiver um histórico sobre o assunto, ainda há chances de descobrir uma curiosidade.
Considerando os tipos fundamentais de C++, algumas perguntas comuns que aparecem por aí são as seguintes:
- Qual o resultado de sizeof(int)?
- sizeof(long) é maior do que sizeof(int)?
- É garantido que sizeof(char) seja 1 (um)?
Apesar de estar particularmente interessado na última delas, aproveito a ocasião para esclarecer (ou relembrar) as duas primeiras. Principalmente, pois costumam ser uma surpresa para iniciantes em C++, tendo em vista que não existe uma resposta bem definida para nenhuma delas.
O tamanho de um int não é padronizado em C++. O termo definido pela implementação (implementation-defined) é utilizado pelo padrão para abordar situações como essa. Portanto, o resultado de sizeof(int) pode não ser o mesmo em plataformas/ambientes diferentes. (No caso de int o tamanho sugerido é aquele natural da arquitetura.) Em um hardware embarcado, por exemplo, pode ser 2 bytes. Já em um computador de grande porte pode ser 8 bytes.
Além disso, também não é correto assumir que sizeof(long) é maior do que sizeof(int). Novamente, o padrão C++ não faz exigências quanto a isso. Basicamente, a única restrição imposta aos tipos fundamentais é de que sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long). Replico abaixo o texto oficial do ISO/IEC 14882 (2003).
”There are four signed integer types: “signed char”, “short int”, “int”, and “long int.” In this list, each type provides at least as much storage as those preceding it in the list.“
A última pergunta, que também é o título do post, tem resposta positiva. Ou seja, sizeof(char) é sempre igual a 1 byte. No entanto, não se empolgue muito em criar códigos mirabolantes através de manipulações de bits baseados no tamanho do char. Apesar da garantia acima existir, o padrão C++ não define qual o número de bits que um byte possui. Novamente, o termo implementation-defined se aplica:
”A byte is at least large enough to contain any member of the basic execution character set and is composed of a contiguous sequence of bits, the number of which is implementation-defined.“
É claro que na maioria dos casos um byte consiste de 8 bits. (Por coincidência, me lembro de ter lido recentemente algo sobre uma plataforma na qual o byte era composto de 7 bits. Não lembro onde nem os detalhes…) Logo, talvez essa “preocupação” nao tenha tanta justificativa do ponto de vista prático. Mas de qualquer forma, o conhecimento é sempre útil!