向size_t添加 int 的正确方法

Proper way to add an int to a size_t

本文关键字:方法 int 添加 size      更新时间:2023-10-16

我收到关于以下代码的 Clang 警告"隐式转换更改符号":

size_t x = 10;
int y = -1;
x += y;

x是 std::vector 的索引,因此它应该是无符号的长整型(又名 size_t(是有道理的,但y偏移量可能是正的或负的,因此需要签名。我可以将y转换为使警告静音并产生正确结果的size_t,但这似乎不正确,因为强制转换值绝对不再等于 -1。那么,有没有一种正确的方法可以在size_t中添加负数?

似乎不正确,因为强制转换值绝对不再等于-1。

就加法的结果而言,它不再是 -1 并不重要。它仍然与 -1 模 M1全等,因此无符号加法具有正确的结果。

1M 是可表示值的数量。

那么,有没有一种正确的方法可以在size_t中添加负数?

您可以完全按照示例中执行的操作进行操作。这是恰当的。

如果要使警告保持启用状态,并希望将其静音,则可以进行显式转换。但这实际上更容易出错,因为如果您不小心转换为错误的无符号类型(这可能是由于重构而发生的(,上述假设不再成立。因此,还应避免将转换后的无符号值存储在中间变量中。我建议您不要启用有问题的警告选项。


如注释中所述,由于您使用的是size_t,您可能需要考虑使用ptrdiff_t作为偏移类型,以便您可以偏移到任何索引。

由于您正在索引vector更合适的是使用vector::size_typevector::difference_type尽管在实践中它们可能与size_tptrdiff_t相同。

相关文章: