Tipos de caracteres em C: distintos ou equivalentes?
Em C , o comportamento dos tipos de caracteres (char) às vezes pode ser diferente daquele de inteiros assinados e não assinados, levando à confusão. Especificamente, o código a seguir demonstra essa diferença:
#include
typedef signed char int8;
typedef unsigned char uint8;
struct TrueType {};
struct FalseType {};
template
struct isX
{
typedef typename T::ikIsX ikIsX;
};
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
template bool getIsTrue();
template bool getIsTrue() { return true; }
template bool getIsTrue() { return false; }
int main(int, char **t )
{
cout ::ikIsX >() ::ikIsX >() ::ikIsX >() Este código compila, mas produz resultados diferentes para char e para int8 e uint8. Isso ocorre porque C trata char, char assinado e unsigned char como três tipos distintos.
Em contraste, int e uint32 são tipos equivalentes:
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
Essa distinção decorre do fato de que char tem sido historicamente usado tanto para representar caracteres quanto para armazenar valores numéricos. Como resultado, C mantém compatibilidade com versões anteriores tratando char simples como um tipo separado, distinto de int.
Para determinar qual das duas representações char usa, o typedef char_traits::signed definido pela implementação é oferecido. Se isso for verdade, char se comporta como um tipo assinado; caso contrário, ele se comporta como um tipo não assinado.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3