将未知类型与负值进行比较

时间:2013-09-10 22:13:45

标签: c unsigned-integer platform-agnostic

我有一个变量id,其类型可能因平台而异。在一些地方,现有代码(我无法更改)将id设置为“负”值,例如

id = -ETIMEDOUT;

在某些平台上,可能会签署id;在其他人身上,它可能是未签名的。我想测试id是否设置为-ETIMEDOUT。当id未签名时,下面的天真尝试会巧妙地失败:

if(id == -ETIMEDOUT)

我如何简明扼要地测试这种情况?

2 个答案:

答案 0 :(得分:2)

试试这个:

id += ETIMEDOUT;
if(id == 0) { /* timed out */ }
id -= ETIMEDOUT; /* if you need to keep id untouched */

答案 1 :(得分:2)

@jlahd发布了一个很好的答案。我想提供一个替代方案。

if (id == (typeof(id)) -ETIMEDOUT)

我认为这会有类似的但是它有问题。它不在C标准中,是GCC扩展。

您可以阅读更多相关信息here

@ rici评论的逐字引用:

  

因为你可能知道一些作为id类型的typedef,所以你可以在没有typeof的情况下做到这一点,尽管那更干净。但是,它应该是

(typeof(id))(-ETIMEDOUT) 
  

(-ETIMEDOUT周围的括号只是化妆品,但需要一元减号。)或者,以下应该是非常简单的:

if (-id == ETIMEDOUT)
  

因为如果id被签名,那显然有效;如果id是无符号的,则一元减号具有明确定义的行为。