3 回答
TA贡献1815条经验 获得超10个赞
-1将始终转换为最大无符号值,这是由于“ 4.7 整数转换”部分所致:
如果目标类型是无符号类型,则结果值是与源整数一致的最小无符号整数(取模2n,其中n是用于表示无符号类型的位数)。[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有任何变化(如果没有截断)。—尾注]
C99的相同报价来自6.3.1.3:
否则,如果新类型是无符号的,则通过重复添加或减去比新类型中可以表示的最大值多一个值来转换该值,直到该值在新类型的范围内为止。49)
因此,我们最终得到:
-1 + (UMAX + 1)
这是:
UMAX
TA贡献1788条经验 获得超4个赞
明显的警告在于一组元素的大小等于可能的最大大小。在实践中发生这种情况的可能性和可用性,并且实际上实际上是造成问题的原因。
如果您查看C ++ std::string
类,您会注意到static std::string::npos
数据成员被定义为完全-1
转换为std::string::size_type
(实际上只是std::size_t
。)这给该“技术”带来了优先感,使它能够完成“ Least Surprise™”的原理。永远是一件好事®。
现在,-1
直接在这样的比较中使用会带来麻烦。您应该(视std::string
情况而定)确保此值有一个可访问的名称,以确保其特殊含义。不幸的是,C ++类型系统还不够严格,无法防止用户用脚射击自己,但是至少坚持记录的最佳实践的用户不会想到做不同的事情。
TA贡献1880条经验 获得超4个赞
在尝试思考可能会出问题的方式之后,我意识到调用函数可能会隐式地将返回值强制转换为更大的类型(即,将unsigned int转换为unsigned long long)。然后检查该值== -1是否为假。
比较安全的选择是显式使用size_t.max作为前哨值。我总是对在有符号和无符号类型之间进行转换感到不舒服。有时我认为更合理的方法是使所有内容都签名(就像Java一样)。
- 3 回答
- 0 关注
- 754 浏览
添加回答
举报