我自己正在实现一个随机数引擎(不,我没有发明一个)并且想知道如果参数为负数应该怎么做。所以我检查了 mersenne_twister_engine 的代码,发现了这个:
void discard(unsigned long long _Nskip)
{ // discard _Nskip elements
for (; 0 < _Nskip; --_Nskip)
(*this)();
}
无符号类型在这些地方不危险吗?
我自己正在实现一个随机数引擎(不,我没有发明一个)并且想知道如果参数为负数应该怎么做。所以我检查了 mersenne_twister_engine 的代码,发现了这个:
void discard(unsigned long long _Nskip)
{ // discard _Nskip elements
for (; 0 < _Nskip; --_Nskip)
(*this)();
}
无符号类型在这些地方不危险吗?
只有当条件是 时才危险x <= 0
。 x > 0
(或0 < x
)是安全的。
基本上你必须避免的是从 0 中减去(更具体地说,你需要它这样x - y >= 0
)。for 语句将最后一次执行,如果循环检查是否等于 0,那将是一个问题(0 - 1 通常 = 最大值)。只要 1 是结束条件,减去 1 即可 ( 1 - 1 >= 0
)。
编辑:再次阅读您的问题后,我不确定我是否解决了实际问题(我认为您可能在 5 分钟的窗口内进行了编辑?或者我只是没有阅读它。))
无论如何,David Rodriguez 提到了它未签名的原因:丢弃负数的元素没有意义。(另外,如果你确实设法将一个负值传递给那个[以它的形式],那将是一个巨大的正数的位模式,并且会发生糟糕的、糟糕的事情。)
有些人喜欢使用unsigned
只存储正数的变量。其他一些人不想unsigned
用来表示那个意思。
这是一个经常被讨论的话题。我在后一个阵营:我不会unsigned
在这样的参数中使用。例如,当我为 -like 类编写size()
函数时,我使用,即使大小永远不会小于 0。list
int
如果您愿意,使用断言或测试并抛出来拒绝负值int
似乎是合适的。阵营中的人unsigned
会说,当你传递一个负值时,编译器应该在调用端发出警告。你可以继续争论,我相信你会在互联网上找到很多。