我正在为我的团队研究使用 size_t
与 int
(或 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 作为索引等事物的标准。我在这里看到了一些关于这个主题的有趣帖子,但它们没有解决数学问题(或者我错过了)。
最佳答案
这不能保证可移植,但也不是 UB。代码必须无错误地运行,但生成的 int
值是实现定义的。因此,只要您在保证所需行为的平台上工作,这很好(只要差异可以由 int
表示),否则,只需在任何地方使用带符号的类型(参见最后一段)。
减去两个 std::size_t
将产生一个新的 std::size_t
† ,其值将通过换行确定。在您的示例中,假设 64 位 size_t
,a - 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_t
是 unsigned short
。在这种情况下,结果是一个 int
并且一切都会正常工作(除非 int
不比 short
宽)。不过
- 我不知道有什么平台可以做到这一点。
- 这仍然是特定于平台的,请参见第一段。
关于c++ - 取两个 size_t 对象的差异是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34642724/