我正在查看c源文件,我发现了这个宏:
#define random ( (float) rand() / (float) ((1 << 31) -1) )
虽然在标准ANSI C中rand()在[0,32767]中返回一个整数,但我真的很感谢帮助理解什么样的归一化因子是分母,因为有符号整数是16位而表达式是31-位移。
非常感谢你的关注 最好的问候
答案 0 :(得分:2)
rand
在“ANSI C”中的[0,32767]中不返回整数。 §7.20.2:
rand
函数计算0
到RAND_MAX
范围内的伪随机整数序列。
编写该宏的人似乎正在开发RAND_MAX
为2147483647的平台。
您似乎也对签名的整数感到困惑。 int
必须至少 16位宽,但通常更宽。
答案 1 :(得分:1)
#define random ( (float) rand() / (float) ((1 << 31) -1) )
在具有16位int
的系统中,由于1 << 31
表达式(1
属于int
类型),此宏是未定义的行为。
(C99,6.5.7p3)“如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。”