可能重复:
Macro to test whether an integer type is signed or unsigned
为了测试给定的整数类型是有符号还是无符号,我使用了以下宏:
#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;
}
该程序将在使用二进制和一进制补码表示的实现中工作。这个想法是当零是一个补码时,MSB将被设置为1.然后根据类型转换,结果将是正面的或负面的。
我想知道您对这个关于可移植性的宏定义的看法吗?
答案 0 :(得分:3)
修正版:
#define IS_SIGNED(type) ((type)-1 < 0)
原始版本仅使用~0
作为编写-1
的不良方式,但它仅适用于二进制补码实现。 (它也恰好在符号量级实现上工作,但失败甚至可能在补充系统上崩溃。)