c++ - 取两个 size_t 对象的差异是否安全?

标签 c++ size-t

我正在为我的团队研究使用 size_tint(或 long 等)的标准。我所看到的最大缺点是,取两个 size_t 对象的差异可能会导致问题(我不确定具体的问题——也许某些东西不是 2s 的补码,并且有符号/无符号会激怒编译器)。我使用 V120 VS2013 编译器用 C++ 编写了一个快速程序,它允许我执行以下操作:

#include <iostream>

main()
{
    size_t a = 10;
    size_t b = 100;
    int result = a - b;
}

程序产生了 -90,虽然它是正确的,但让我对类型不匹配、有符号/无符号问题,或者如果 size_t 碰巧用于复杂数学时只是简单的未定义行为感到紧张。

我的问题是,使用 size_t 对象进行数学运算是否安全,特别是求差?我正在考虑使用 size_t 作为索引等事物的标准。我在这里看到了一些关于这个主题的有趣帖子,但它们没有解决数学问题(或者我错过了)。

What type for subtracting 2 size_t's?

typedef for a signed type that can contain a size_t?

最佳答案

这不能保证可移植,但也不是 UB。代码必须无错误地运行,但生成的 int 值是实现定义的。因此,只要您在保证所需行为的平台上工作,这很好(只要差异可以由 int 表示),否则,只需在任何地方使用带符号的类型(参见最后一段)。

减去两个 std::size_t 将产生一个新的 std::size_t ,其值将通过换行确定。在您的示例中,假设 64 位 size_ta - b 将等于 18446744073709551526。这不适合(常用的 32 位)int,因此将实现定义的值分配给 result

老实说,我建议不要将无符号整数用于除魔法之外的任何事情。标准委员会的几位成员同意我的看法:https://channel9.msdn.com/Events/GoingNative/2013/Interactive-Panel-Ask-Us-Anything 9:50、42:40、1:02:50

经验法则(从上面的视频中解释 Chandler Carruth):如果您可以自己计算,请使用 int,否则使用 std::int64_t


除非它的转化等级小于int,例如如果 std::size_tunsigned short。在这种情况下,结果是一个 int 并且一切都会正常工作(除非 int 不比 short 宽)。不过

  1. 我不知道有什么平台可以做到这一点。
  2. 这仍然是特定于平台的,请参见第一段。

关于c++ - 取两个 size_t 对象的差异是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34642724/

相关文章:

c++ - 为什么通过基类指针初始化派生类与通过派生类指针初始化不同?

c++ - 反向字符串函数给我一个段错误

C++:如何重用我的模板代码

c++ - C++ 中用于 size_t 类型的 ceil() 和 floor() 函数

c++ - 为什么 std::array 中的 size_type 是 size_t ,而 std::vector 中的 size_type 通常是 size_t ?

c++ - 使用来自两个列表的组合生成函数调用

c++ - 为什么我的 GLSL 着色器编译失败且没有错误消息?

c - 像 snprintf 这样的函数中的 size_t 混淆

c++ - size_t 是否仅在 C++ 标准或 C 标准中?

c - nel -= nel/2 在功能上等同于 nel/= 2 吗?