用于测试给定整数类型在C中是否为有符号或无符号的宏?

时间:2011-11-01 05:38:13

标签: c

  

可能重复:
  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.然后根据类型转换,结果将是正面的或负面的。

我想知道您对这个关于可移植性的宏定义的看法吗?

1 个答案:

答案 0 :(得分:3)

修正版:

#define IS_SIGNED(type) ((type)-1 < 0)

原始版本仅使用~0作为编写-1的不良方式,但它仅适用于二进制补码实现。 (它也恰好在符号量级实现上工作,但失败甚至可能在补充系统上崩溃。)