我查了C標準(從1999年),它只是說RAND_MAX
應該至少32767,但沒有說這個宏是否應擴展到一個有符號或無符號的int。單一UNIX規範(link 1,link 2)和Linux man(link)沒有增加任何清晰度。RAND_MAX宏:有符號還是無符號?
有人會認爲RAND_MAX
應該是signed int
因爲這就是rand()
返回。
然而,我發現,有些編譯器把它定義爲無符號:
- 古老的Turbo C++ 1.01:#定義RAND_MAX 0x7FFFU
- 沒有這麼古老的C++ Builder的5.5:#定義RAND_MAX 0x7FFFU
- 的還活着打開WATCOM C/C++ 1.9:#定義RAND_MAX 32767U
- DJGPP(用於DOS的gcc 3.3.4):#定義RAND_MAX 2147483647
- MinGW的(適用於Windows的gcc 4.6.2):#定義RAND_MAX 0x7FFF的
- MS的Visual Studio 2010(link): RAND_MAX被定義爲值0x7FFF的
- 微小C編譯器0.9.25:#限定RAND_MAX 0x7FFF的
- LCC-win32的3.8:#定義RAND_MAX 0x7FFF的
- Pellesç6.50:#定義RAND_MAX 0x3fffffff OR的#define RAND_MAX 0x7FFF的
- 數字火星C/C++ 8.52:#定義RAND_MAX 32767
這使得表面上無害代碼像下面成爲非便攜式和炸燬由於符號到無符號推廣:
cos(w * t) + (rand() - RAND_MAX/2) * 0.1/(RAND_MAX/2);
rand()
返回的範圍內的signed int
[0,RAND_MAX
]。
如果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規範?
Plaguer&Brodie(1989)關於ANSI/ISO標準的書_Standard C_說RAND_MAX是整型常量表達式≥32767。 K&R的_The C Programming Language_(2nd-Ed 1988)只提到它與'int rand()'函數有關,後者返回一個範圍爲'0'到'RAND_MAX'的值。聲音與我簽署。 – martineau
@martineau聽起來沒有指定給我。 'integer'不僅僅意味着'int','unsigned'和'int'一樣是'integer'。 –
一個不合格的'int'相當於一個'signed'或'signed int',因此將相同的規則與語言規範中單詞「integer」的所有用法聯繫起來是合理的。除此之外,事實是'RAND_MAX'的唯一目的是用來描述'int rand()'函數返回值的限制,這隻會進一步加強這個假設。即爲什麼'#define'是一個'unsigned'數量,它只被用來指定返回'signed'數量的庫函數的可能返回值的範圍? – martineau