¿Macro para probar si un tipo entero dado está firmado o no firmado en C?

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).