"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > `char`, `signed char` e `unsigned char` são verdadeiramente distintos em C++?

`char`, `signed char` e `unsigned char` são verdadeiramente distintos em C++?

Publicado em 2024-11-05
Navegar:101

  Are `char`, `signed char`, and `unsigned char` Truly Distinct in C  ?

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.

Tutorial mais recente Mais>

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