施放ssize_t或size_t

时间:2013-04-18 14:55:17

标签: c++ casting size-t

在我在项目中使用的源文件中,ssize_tsize_t变量之间存在比较:

ssize_t sst;
size_t st;

if(sst == st){...}

我想摆脱警告:

warning: comparison between signed and unsigned integer expressions

但我不确定,我应该向另一个转变哪个变量?

if((size_t)sst == st){...}

if(sst == (ssize_t)st){...}

什么是更安全,更好,更清洁?感谢

2 个答案:

答案 0 :(得分:21)

这个问题没有一个正确的答案。有几种可能的答案,取决于您对先验所了解的关于这些变量可能采用的值。

  • 如果你知道sst是非负面的,那么你可以安全地将sst投射到size_t,因为这不会改变价值(顺便提一下,这就是如果你根本没有演员,就会发生。)

  • 如果sst可能是否定的,但您知道st永远不会大于SSIZE_MAX,那么您可以安全地将st投射到ssize_t },因为这不会改变价值。

  • 如果sst可能是否定的,并且st可能大于SSIZE_MAX,那么两次投射都不正确;任何一个都可能改变该值,导致不正确的比较。相反,您将执行以下if (sst >= 0 && (size_t)sst == st)

如果您绝对确定前两种情况之一适用,请选择第三种选项,因为它在所有情况下都是正确的。

答案 1 :(得分:3)

只要两个值都适合ssize_t的正可表示范围,两者都可以正常工作。

如果值,您可能会遇到麻烦 - 在测试相等性之前检查这些情况:

if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
  ...
}

(我确信C ++人员会建议你完全避免使用C风格的演员 - 我毫不怀疑有人会发表评论或回答并让你知道在C ++中这样做的正确方法。)