Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 铸造尺寸_C++_Casting_Size T - Fatal编程技术网

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))
{
  ...
}