对16位整数进行奇怪的按位运算

时间:2012-02-02 19:42:34

标签: c bit-manipulation

我正在查看c源文件,我发现了这个宏:

#define random ( (float) rand() / (float) ((1 << 31) -1) )

虽然在标准ANSI C中rand()在[0,32767]中返回一个整数,但我真的很感谢帮助理解什么样的归一化因子是分母,因为有符号整数是16位而表达式是31-位移。

非常感谢你的关注 最好的问候

2 个答案:

答案 0 :(得分:2)

rand在“ANSI C”中的[0,32767]中不返回整数。 §7.20.2:

  

rand函数计算0RAND_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)“如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。”