gpt4 book ai didi

c - RAND_MAX 宏 : signed or unsigned?

转载 作者:太空狗 更新时间:2023-10-29 16:36:20 25 4
gpt4 key购买 nike

我查阅了 C 标准(自 1999 年起),它只说 RAND_MAX 应该至少为 32767,但没有说明这个宏应该扩展为有符号整数还是无符号整数。单一 UNIX 规范(link 1link 2)和 Linux 手册(link)没有增加任何清晰度。

有人会认为 RAND_MAX 应该是一个 signed int,因为这就是 rand() 返回的值。

但是,我发现一些编译器将其定义为无符号:

  • 古老的 Turbo C++ 1.01:#define RAND_MAX 0x7FFFU
  • 不太古老的 C++ Builder 5.5:#define RAND_MAX 0x7FFFU
  • 仍然存在的 Open Watcom C/C++ 1.9:#define RAND_MAX 32767U
  • DJGPP(适用于 DOS 的 gcc 3.3.4):#define RAND_MAX 2147483647
  • MinGW(适用于 Windows 的 gcc 4.6.2):#define RAND_MAX 0x7FFF
  • MS Visual Studio 2010 ( link ):RAND_MAX 定义为值 0x7fff
  • Tiny C 编译器 0.9.25:#define RAND_MAX 0x7FFF
  • lcc-win32 3.8: #define RAND_MAX 0x7fff
  • Pelles C 6.50:#define RAND_MAX 0x3fffffff #define RAND_MAX 0x7fff
  • Digital Mars C/C++ 8.52:#define RAND_MAX 32767

这使得像下面这样看似无害的代码变得不可移植,并且由于已签名到未签名的升级而崩溃:

cos(w * t) + (rand() - RAND_MAX / 2) * 0.1 / (RAND_MAX / 2);

rand() 返回 [0,RAND_MAX] 范围内的 signed int

如果 RAND_MAX 定义为 unsigned int,则 rand() 的值将提升为 unsigned int 也是。

如果是这种情况,差值 (rand() - RAND_MAX/2) 将成为无符号整数的无符号差值,其值在 [0,RAND_MAX-RAND_MAX/2] & [UINT_MAX+1-RAND_MAX/2,UINT_MAX-1] 而不是是有符号整数的有符号差,其值在 [-RAND_MAX/2,RAND_MAX-RAND_MAX/2] 范围内。

无论如何,似乎 RAND_MAX 应该被签名并且大多数(?)编译器都这样定义它,但是是否有任何权威来源说它应该被签名?旧标准? K&R?另一个 UNIX 规范?

最佳答案

是的,这看起来像是标准中的缺陷。

首先,现在可能没有人会定义 rand() 来返回一个 int。意图显然是返回一个正数,并且没有错误返回可以使用负数返回。如果今天引入这样的函数,它将被设计为使用无符号整数类型作为返回类型。我的猜测是它早于 C89 和无符号整数概念在该语言中的引入。

然后,很明显,人们必须期望函数返回的最大值的定义与函数之一具有相同的类型。在其他地方,宏被很好地定义为扩展到具有特定类型的表达式,所以这在这里也是可能的。

至于你的问题,我认为最简单的方法是通过执行类似 rand()/( RAND_MAX+1.0) 并从那里导出所有计算。在任何情况下,如果您的平台没有更好的伪随机生成器可用,您应该仅将 rand() 用作最后的手段。例如,在 POSIX 系统上,rand48 系列是一个方便的替代品,具有详细描述的属性。

关于c - RAND_MAX 宏 : signed or unsigned?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com