2012-02-02 63 views
0

我期待在交流源文件和我發現這個宏:奇怪位運算

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

而在標準ANSI C蘭特()返回一個整數[0,32767] ,我非常感謝幫助理解分母是什麼樣的歸一化因子,因爲有符號整數是16位,表達式是31位移位。

非常感謝您對我們的關注 問候

+0

爲什麼說有符號整數是16位? – TJD 2012-02-02 19:45:12

+1

其中之一,有符號整數並不總是16位。在這種情況下可能是32位。 – Mysticial 2012-02-02 19:45:44

+0

C標準只保證'int'至少有16位(它們通常是32位,但也可能是64位或48位或許多其他尺寸)。 – 2012-02-02 19:49:18

回答

2

rand在「ANSI C」不返回[0,32767]一個整數。 §7.20.2:

rand函數計算的範圍0RAND_MAX僞隨機整數的序列。

這很可能是誰寫的是宏正致力於一個平臺,在其上RAND_MAX爲2147483647


你似乎也感到困惑符號整數。 int必須是至少 16位寬,但它通常更寬。

+0

在C中,'RAND_MAX'至少是'32767'。在具有16位「int」的系統中,「RAND_MAX」通常*等於「32767」。 – ouah 2012-02-02 19:54:09

1
#define random ((float) rand()/(float) ((1 << 31) -1)) 
與16位 int系統

,該宏是未定義的行爲,因爲1 << 31表達式(1int類型)。

(C99,6.5.7p3)「如果右操作數的值是負的或大於或等於所述推動左操作數的寬度,該行爲是未定義」。