Tipos de caracteres en C: ¿distintos o equivalentes?
En C, el comportamiento de los tipos de caracteres (char) a veces puede diferir del de enteros con y sin signo, lo que genera confusión. Específicamente, el siguiente código demuestra esta diferencia:
#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 se compila pero produce resultados diferentes para char que para int8 y uint8. Esto se debe a que C trata a char, char firmado y char sin firmar como tres tipos distintos.
Por el contrario, int y uint32 son tipos equivalentes:
template struct isX { typedef FalseType ikIsX; };
template struct isX { typedef FalseType ikIsX; };
Esta distinción surge del hecho de que char se ha utilizado históricamente tanto para representar caracteres como para almacenar valores numéricos. Como resultado, C mantiene la compatibilidad con versiones anteriores al tratar char simple como un tipo separado, distinto de int.
Para determinar cuál de las dos representaciones utiliza char, el typedef definido por la implementación char_traits::signed es proporcionó. Si esto es cierto, char se comporta como un tipo con signo; de lo contrario, se comporta como un tipo sin firmar.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3