为了账号安全,请及时绑定邮箱和手机立即绑定

使用-1作为无符号(size_t)类型的标志值

使用-1作为无符号(size_t)类型的标志值

C++
回首忆惘然 2019-11-20 10:02:23
我正在使用-1作为其返回类型为size_t(无符号类型)的函数的标志值。我最初没有注意到它,特别是因为它没有在我的代码中引起任何错误(我使用x == -1进行检查,而不是x <0)。有什么微妙的原因我不应该保留它吗?什么时候会出现意外情况?这是常用的吗?ptrdiff_t不太常见,需要花费较长的时间输入,而且由于函数会将索引返回到数组中,因此它并不是真正合适的类型。
查看完整描述

3 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

-1将始终转换为最大无符号值,这是由于“ 4.7 整数转换”部分所致:


如果目标类型是无符号类型,则结果值是与源整数一致的最小无符号整数(取模2n,其中n是用于表示无符号类型的位数)。[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有任何变化(如果没有截断)。—尾注]


C99的相同报价来自6.3.1.3:


否则,如果新类型是无符号的,则通过重复添加或减去比新类型中可以表示的最大值多一个值来转换该值,直到该值在新类型的范围内为止。49)


因此,我们最终得到:


-1 + (UMAX + 1)

这是:


UMAX


查看完整回答
反对 回复 2019-11-20
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

明显的警告在于一组元素的大小等于可能的最大大小。在实践中发生这种情况的可能性和可用性,并且实际上实际上是造成问题的原因。

如果您查看C ++ std::string类,您会注意到static std::string::npos数据成员被定义为完全-1转换为std::string::size_type(实际上只是std::size_t。)这给该“技术”带来了优先感,使它能够完成“ Least Surprise™”的原理。永远是一件好事®。

现在,-1直接在这样的比较中使用会带来麻烦。您应该(视std::string情况而定)确保此值有一个可访问的名称,以确保其特殊含义。不幸的是,C ++类型系统还不够严格,无法防止用户用脚射击自己,但是至少坚持记录的最佳实践的用户不会想到做不同的事情。


查看完整回答
反对 回复 2019-11-20
?
慕村225694

TA贡献1880条经验 获得超4个赞

在尝试思考可能会出问题的方式之后,我意识到调用函数可能会隐式地将返回值强制转换为更大的类型(即,将unsigned int转换为unsigned long long)。然后检查该值== -1是否为假。

比较安全的选择是显式使用size_t.max作为前哨值。我总是对在有符号和无符号类型之间进行转换感到不舒服。有时我认为更合理的方法是使所有内容都签名(就像Java一样)。


查看完整回答
反对 回复 2019-11-20
  • 3 回答
  • 0 关注
  • 754 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信