我期待在交流源文件和我發現這個宏:奇怪位運算
#define random ((float) rand()/(float) ((1 << 31) -1))
而在標準ANSI C蘭特()返回一個整數[0,32767] ,我非常感謝幫助理解分母是什麼樣的歸一化因子,因爲有符號整數是16位,表達式是31位移位。
非常感謝您對我們的關注 問候
我期待在交流源文件和我發現這個宏:奇怪位運算
#define random ((float) rand()/(float) ((1 << 31) -1))
而在標準ANSI C蘭特()返回一個整數[0,32767] ,我非常感謝幫助理解分母是什麼樣的歸一化因子,因爲有符號整數是16位,表達式是31位移位。
非常感謝您對我們的關注 問候
rand
在「ANSI C」不返回[0,32767]一個整數。 §7.20.2:
的
rand
函數計算的範圍0
到RAND_MAX
僞隨機整數的序列。
這很可能是誰寫的是宏正致力於一個平臺,在其上RAND_MAX
爲2147483647
你似乎也感到困惑符號整數。 int
必須是至少 16位寬,但它通常更寬。
在C中,'RAND_MAX'至少是'32767'。在具有16位「int」的系統中,「RAND_MAX」通常*等於「32767」。 – ouah 2012-02-02 19:54:09
#define random ((float) rand()/(float) ((1 << 31) -1))
與16位
int
系統
,該宏是未定義的行爲,因爲1 << 31
表達式(1
是int
類型)。
(C99,6.5.7p3)「如果右操作數的值是負的或大於或等於所述推動左操作數的寬度,該行爲是未定義」。
爲什麼說有符號整數是16位? – TJD 2012-02-02 19:45:12
其中之一,有符號整數並不總是16位。在這種情況下可能是32位。 – Mysticial 2012-02-02 19:45:44
C標準只保證'int'至少有16位(它們通常是32位,但也可能是64位或48位或許多其他尺寸)。 – 2012-02-02 19:49:18