Posible duplicado:
Macro para probar si un tipo entero está firmado o sin firmar
Para probar si el tipo entero dado está firmado o sin firmar, usé la siguiente macro:
#define IS_SIGNED(type) ((type)~0 < 0) int main() { if(IS_SIGNED(char)) cout<<"The char type is signed"<<endl; if(IS_SIGNED(unsigned char)) cout<<"The unsigned char type is signed"<<endl; }
El progtwig funcionará en implementaciones que utilizan la representación de los números del complemento de dos y uno. La idea es que cuando el cero se complementa, el MSB se establecerá en 1. Luego, según el tipo de conversión, el resultado será positivo o negativo.
Me gustaría saber su opinión sobre esta definición de macro con respecto a la portabilidad?
Versión fija:
#define IS_SIGNED(type) ((type)-1 < 0)
La versión original solo usaba ~0
como una manera pobre de escribir -1
, pero solo funciona en implementaciones de dos complementos. (También sucede que funciona en implementaciones de magnitud de signo, pero falla e incluso puede fallar en sistemas complementarios).