施放ssize_t或size_t

rlu*_*uks 11 c++ casting size-t

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

ssize_t sst;
size_t st;

if(sst == st){...}
Run Code Online (Sandbox Code Playgroud)

我想摆脱警告:

warning: comparison between signed and unsigned integer expressions
Run Code Online (Sandbox Code Playgroud)

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

if((size_t)sst == st){...}
Run Code Online (Sandbox Code Playgroud)

要么

if(sst == (ssize_t)st){...}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*non 24

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

  • 如果你知道这sst是非负面的,那么你可以安全地转换sstsize_t,因为这不会改变值(顺便说一句,如果你根本没有演员,会发生这种情况).

  • 如果sst可能是负面但你知道st永远不会大于SSIZE_MAX,那么你可以安全地转换stssize_t,因为这不会改变值.

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

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