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