C++ 铸造尺寸
在我在项目中使用的源文件中,存在C++ 铸造尺寸,c++,casting,size-t,C++,Casting,Size T,在我在项目中使用的源文件中,存在ssize\u t和size\u t变量之间的比较: ssize_t sst; size_t st; if(sst == st){...} 我想摆脱这个警告: warning: comparison between signed and unsigned integer expressions 但我不确定,我应该将哪个变量转换为另一个变量 if((size_t)sst == st){...} 或 什么更安全、更好、更清洁?谢谢只要两个值都在ssize\t的
ssize\u t
和size\u t
变量之间的比较:
ssize_t sst;
size_t st;
if(sst == st){...}
我想摆脱这个警告:
warning: comparison between signed and unsigned integer expressions
但我不确定,我应该将哪个变量转换为另一个变量
if((size_t)sst == st){...}
或
什么更安全、更好、更清洁?谢谢只要两个值都在
ssize\t
的正表示范围内,两个值都可以正常工作
如果两个值中的任何一个都不符合要求,您可能会遇到麻烦-在测试是否相等之前检查这些情况:
if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
...
}
如果((sst>=0)和&(st这个问题没有一个正确答案。根据您对这些变量可能采用的值的先验知识,有几种可能的答案
- 如果您知道
sst
是非负的,那么您可以安全地将sst
强制转换为size\u t
,因为这不会更改值(顺便说一句,如果您根本没有强制转换,就会发生这种情况)
- 如果
sst
可能为负值,但您知道st
永远不会大于SSIZE\u MAX
,那么您可以安全地将st
强制转换为SSIZE\u t
,因为这不会改变值
- 如果
sst
可能为负值,并且st
可能大于SSIZE\u MAX
,则两个cast都不正确;任何一个都可能更改值,从而导致不正确的比较。相反,如果(sst>=0&(size\u t)sst==st),您将执行以下
如果您不能绝对确定前两种情况中的一种适用,请选择第三种,因为它在所有情况下都是正确的。您使用的是什么语言?请尝试在前面加上(带符号的int)
在无符号整数之前。它现在应该都是有符号整数,并且不会再抛出错误。@Allendar:将size\u t
强制转换为int
会导致灾难。在64位平台上,int
通常只有32位宽。+1@larsmans。即使它们的大小相同,如果无符号值不是可在有符号变量中表示,它会导致实现定义的行为,使代码(可能)不那么可移植。@Allendar:我真的,真的希望永远不会看到有人这样做。+1对于更简单的表达式-没有理由使用(ST)一旦排除了代码> SST < 0 <代码>,就可以转换为<代码> siZeSt<<代码>,比较.<代码> StasyType(ST) >是一个稍微安全的C++ CAST。
if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
...
}