【发布时间】:2022-03-28 23:04:05
【问题描述】:
int rand();
返回0和 RAND_MAX(包括0和 RAND_MAX)之间的伪随机整数值。
既然保证会返回一个非负整数,那为什么返回类型是有符号的呢?
我不是在谈论我们是否应该在这里使用它。这是一个历史问题还是一些糟糕的设计?
【问题讨论】:
-
可能是因为 int 在过去被认为是一流的类型。 (K&R C legacy ?)请注意,支持无符号类型的语言相对较少。
-
如果
RAND_MAX小于 2^31(通常更小),那么未签名没有任何好处,但如果有人这样做rand() % 100 - 50可能会得到令人惊讶的结果跨度> -
请注意,rand() 是一个非常古老的函数。在 C 标准化之前,它肯定就在这里。它可能是在将无符号整数添加到语言之前创建的。
-
这是历史性的。 (记忆中)
rand()/srand()在 C 支持的无符号(或长!)类型之前指定。那时,大多数 C 实现都有 16 位的int,只有少数有 32 位的int,这就是为什么RAND_MAX只需要 32767(或更多)。当 Unix 用 C 重写时(1973 年),引入了无符号和长类型(除其他外)。 C 的后续演变(包括 C89 标准)保持向后兼容性,第一个 C++ 标准(根据 ARM)需要尽可能保持与 C89 的兼容性。