如何判断C整数变量是否已签名?

sig*_*ice 8 c gcc integer c-preprocessor

作为练习,我想写一个宏,它告诉我是否签署了整数变量.这就是我到目前为止所得到的结果,如果我在使用gcc -fsigned-char或-funsigned-char的char变量上尝试这个结果,我会得到结果.

#define ISVARSIGNED(V) (V = -1, (V < 0) ? 1 : 0) 
Run Code Online (Sandbox Code Playgroud)

这是便携式吗?有没有办法在不破坏变量值的情况下执行此操作?

mob*_*mob 6

#define ISVARSIGNED(V)  ((V)<0 || (-V)<0 || (V-1)<0)
Run Code Online (Sandbox Code Playgroud)

不改变V的值.第三个测试处理V == 0的情况.

在我的编译器(gcc/Cygwin的),这适用于intlong,但不适合charshort.

#define ISVARSIGNED(V) ((V)-1<0 || -(V)-1<0)
Run Code Online (Sandbox Code Playgroud)

在两次测试中也做了这项工作.

  • 不区分有符号/无符号短整型和字符。在计算 &lt; == &gt; 表达式时,这些类型将提升为 int。 (2认同)

ypn*_*nos 5

#define ISVARSIGNED(V) ((-(V) < 0) != ((V) < 0))
Run Code Online (Sandbox Code Playgroud)

不破坏变量的值.但不适用于0值.

关于什么:

#define ISVARSIGNED(V) (((V)-(V)-1) < 0)
Run Code Online (Sandbox Code Playgroud)

  • #define ISVARSIGNED(V)(( - V <0)!=(V <0)) (3认同)

Chr*_*utz 5

如果您正在使用GCC,则可以使用typeof关键字来覆盖该值:

#define ISVARSIGNED(V) ({ typeof (V) _V = -1; _V < 0 ? 1 : 0 })
Run Code Online (Sandbox Code Playgroud)

这将创建一个临时变量,_V其类型与V.

至于便携性,我不知道.它可以在两个赞美机器上运行(也就是你的代码将在任何可能的情况下运行的所有东西),我相信它也适用于一个人的赞美和符号级别的机器.作为旁注,如果您使用typeof,您可能希望-1转换typeof (V)为使其更安全(即不太可能触发警告).