向size_t添加 int 的正确方法
Proper way to add an int to a size_t
我收到关于以下代码的 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_type
和vector::difference_type
尽管在实践中它们可能与size_t
和ptrdiff_t
相同。
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有什么方法可以使用 int 变量来完成组件名称吗?
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 这是在传递 int num 时创建搜索函数的正确方法吗?使用链表库
- 向size_t添加 int 的正确方法
- 有没有一种简单的方法可以将矢量 int 集转换为字符串输出?
- 最有效的安全方法将 std::map<int, std::shared_ptr> 转换为 std::<Base>map<int, std::shared_ptr<D
- 有人可以向我解释什么[](int i){返回i%2 == 0;} 方法
- C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
- 如何从方法返回静态常量 int std::array?
- 判断 int 是否在 C++ 中赋值的任何优雅方法
- 从 C++ 中的 int 方法返回一个数组
- 使用 void 方法将字符串从 txt 文件检索到 int C++的向量
- 如何在-120到120之间更改int到char(或其他简单保存为一个字节的简单方法)
- 有没有一种优雅的方法来读取二进制文件并将其内容复制到向量<int>
- 不能和正确的方法来声明类成员 c++11 中的 int 数组数组
- C++ 重构采用 int 或字符串参数的方法
- 在Windows中等待std::atomic的正确方法<int>?
- 将 std::vector 的每个值重置为 0 的最快方法<int>