为什么 std::rand() 的 return 类型不是 unsigned int?
Why is the return type of std::rand() not an unsigned int?
std::rand 表示,
int rand();
Returns a pseudo-random integral value between 0 and RAND_MAX (0 and RAND_MAX included).
既然保证非负整数将被returned,为什么return类型是有符号的?
我不是在说我们是否应该在这里使用它。是历史问题还是设计不好?
关于 unsigned
的争论很多。在不深入主观领域的情况下,请考虑以下几点:重要的不是从 rand()
得到的值 return 是否可以为负数。重要的是 rand()
return 是特定类型的值,该类型决定了您可以使用该值做什么。 rand()
永远不会 return 是负值,但是对使该值变为负值的值应用操作是否有意义?当然可以。例如你可能想做:
auto x = rand() % 6 - 3;
如果 rand()
会 return 和 unsigned
那么这将导致代码中看起来不错的令人困惑的错误。
例如使用 unsigned
作为索引是另一回事。指数总是正的。如果你想对它应用将值变为负值的操作,那么它就不再是索引了。另一方面,rand() % 6 -3
是一个随机数,无论是否为正数。
类型超出了它可以表示的值的范围。有符号和无符号整数具有不同的语义。
请注意,C++20 引入了 std::ssize
。一个容器那么大,只能是正数。尽管如此,它还是被签署了。这是一个正值的例子,它被签名只是为了允许有符号的算术。此外,将 std::size
更改为 return 也不是一个选项,因为这会破坏现有代码。
作为旁注,请考虑 Java 根本没有无符号整数类型,因为无符号算术被认为太混乱了。
Stroustrup 在“C++ 编程语言:6.2.4 整数类型”中写道:
*unsigned 整数类型非常适合将存储视为位数组的用途。使用 unsigned 而不是 int 来获得更多一位来表示正整数几乎不是一个好主意。 通过声明无符号变量来确保某些值是正值的尝试通常会被隐式转换规则击败。
std::rand 表示,
int rand();
Returns a pseudo-random integral value between 0 and RAND_MAX (0 and RAND_MAX included).
既然保证非负整数将被returned,为什么return类型是有符号的?
我不是在说我们是否应该在这里使用它。是历史问题还是设计不好?
关于 unsigned
的争论很多。在不深入主观领域的情况下,请考虑以下几点:重要的不是从 rand()
得到的值 return 是否可以为负数。重要的是 rand()
return 是特定类型的值,该类型决定了您可以使用该值做什么。 rand()
永远不会 return 是负值,但是对使该值变为负值的值应用操作是否有意义?当然可以。例如你可能想做:
auto x = rand() % 6 - 3;
如果 rand()
会 return 和 unsigned
那么这将导致代码中看起来不错的令人困惑的错误。
例如使用 unsigned
作为索引是另一回事。指数总是正的。如果你想对它应用将值变为负值的操作,那么它就不再是索引了。另一方面,rand() % 6 -3
是一个随机数,无论是否为正数。
类型超出了它可以表示的值的范围。有符号和无符号整数具有不同的语义。
请注意,C++20 引入了 std::ssize
。一个容器那么大,只能是正数。尽管如此,它还是被签署了。这是一个正值的例子,它被签名只是为了允许有符号的算术。此外,将 std::size
更改为 return 也不是一个选项,因为这会破坏现有代码。
作为旁注,请考虑 Java 根本没有无符号整数类型,因为无符号算术被认为太混乱了。
Stroustrup 在“C++ 编程语言:6.2.4 整数类型”中写道: *unsigned 整数类型非常适合将存储视为位数组的用途。使用 unsigned 而不是 int 来获得更多一位来表示正整数几乎不是一个好主意。 通过声明无符号变量来确保某些值是正值的尝试通常会被隐式转换规则击败。