12

在我的项目中使用的源文件中,有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){...}

什么更安全、更好、更清洁?谢谢

4

2 回答 2

26

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

  • 如果您知道这sst是非负数,那么您可以安全地sst转换为size_t,因为这不会改变值(顺便说一下,如果您根本没有转换,就会发生这种情况)。

  • 如果sst可能是负数,但您知道它st永远不会大于SSIZE_MAX,那么您可以安全地st转换为ssize_t,因为这不会改变值。

  • 如果sst可能是负数,并且st可能大于SSIZE_MAX,那么两种转换都不正确;任何一个都可能更改值,从而导致不正确的比较。相反,您将执行以下操作if (sst >= 0 && (size_t)sst == st)

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

于 2013-04-18T15:13:29.877 回答
3

只要两个值都在 的正可表示范围内,任何一个都可以正常工作ssize_t

如果任何一个值都不是,您最终可能会遇到麻烦 - 在测试是否相等之前检查这些情况:

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

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

于 2013-04-18T15:06:01.407 回答