【问题标题】:Macro to test whether a given integer type is Signed or Unsigned in C? [duplicate]用于测试给定整数类型在 C 中是有符号还是无符号的宏? [复制]
【发布时间】:2011-11-01 05:38:12
【问题描述】:

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

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

【问题讨论】:

  • 我对它的便携性没有什么疑虑;我只是不清楚它什么时候有用。
  • @JonathanLeffler - 在另一个宏内部,它以整数类型作为参数,根据符号来控制代码输出。
  • @R..:~0在什么情况下会导致崩溃?
  • 它可以是不带负零的补码实现上的陷阱表示。

标签: c


【解决方案1】:

固定版本:

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

原始版本只是使用~0 作为编写-1 的糟糕方式,但它仅适用于二进制补码实现。 (它也恰好适用于符号幅度实现,但会失败,甚至可能在反码系统上崩溃。)

【讨论】:

  • #define IS_SIGNED(type) ((type)-1
  • "-0" 纯粹是一个单独的表示。它的不是负数。 C 没有负零作为整数值。无论如何,我的宏版本不使用负零,所以它与这个答案无关......
猜你喜欢
  • 2010-09-09
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2018-06-29
  • 2010-12-06
  • 2015-04-22
相关资源
最近更新 更多