我收到关于以下代码的 Clang 警告“隐式转换更改签名”:
size_t x = 10;
int y = -1;
x += y;
x
是 std::vector 的索引,因此它应该是一个 unsigned long long(又名 size_t)是有道理的,但 y
是一个偏移量这可能是积极的或消极的,因此需要签名。我可以将 y
转换为 size_t 以消除警告并产生正确的结果,但这似乎不正确,因为转换为值肯定不再等于 -1。那么,有没有合适的方法将负数加到 size_t 上?
最佳答案
this doesn't seem correct because the cast-to value is definitely not equal to -1 anymore.
就相加的结果而言,不再是-1也没关系。它仍然与 -1 模 M 1 全等,因此无符号加法的结果正确。
1 M 是可表示值的数量。
So, is there a proper way to add a negative number to a size_t?
您可以完全按照示例中的操作进行操作。是对的。
如果你想让警告保持启用状态,并且想让它静音,那么你可以进行显式转换。但这实际上更容易出错,因为如果您不小心转换为错误的无符号类型(这可能由于重构而发生),则上述假设不再成立。因此,您还应该避免将转换后的无符号值存储在中间变量中。我建议您不要启用有问题的警告选项。
如评论中所述,由于您使用的是 size_t
,因此您可能需要考虑使用 ptrdiff_t
作为偏移类型,这样您就可以对任何索引进行偏移.
更合适的方法是使用 vector::size_type
和 vector::difference_type
索引 vector
,尽管在实践中它们可能与 size_t
和 ptrdiff_t
相同。
关于c++ - 将 int 添加到 size_t 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57896527/