私は C 標準 (1999 年以降) を調べましたが、それはRAND_MAX
少なくとも 32767 であるべきだと言っているだけで、このマクロが signed または unsigned int に展開されるべきかどうかについては何も述べていません。Single UNIX Specification ( link 1、link 2 ) と Linux man ( link ) は、明確さを追加していません。
それが返さRAND_MAX
れるので、 a であるべきだと思うでしょう。signed int
rand()
ただし、一部のコンパイラでは署名なしとして定義されていることがわかりました。
- 古い Turbo C++ 1.01: #define RAND_MAX 0x7FFFU
- それほど古くない C++ Builder 5.5: #define RAND_MAX 0x7FFFU
- まだ生きている Open Watcom C/C++ 1.9: #define RAND_MAX 32767U
- DJGPP (DOS 用 gcc 3.3.4): #define RAND_MAX 2147483647
- MinGW (Windows 用 gcc 4.6.2): #define RAND_MAX 0x7FFF
- MS Visual Studio 2010 (リンク): RAND_MAX は値 0x7fff として定義されます
- Tiny C コンパイラ 0.9.25: #define RAND_MAX 0x7FFF
- lcc-win32 3.8: #define RAND_MAX 0x7fff
- Pelles C 6.50: #define RAND_MAX 0x3fffffffまたは#define RAND_MAX 0x7fff
- Digital Mars C/C++ 8.52: #define RAND_MAX 32767
これにより、以下のような一見無害なコードが移植不能になり、署名付きから未署名への昇格のために爆発します。
cos(w * t) + (rand() - RAND_MAX / 2) * 0.1 / (RAND_MAX / 2);
rand()
signed int
[0, RAND_MAX
]の範囲でa を返します。
RAND_MAX
が として定義されている場合unsigned int
、 からの値もrand()
に昇格されunsigned int
ます。
その場合、差は、範囲 [0, - /2] & [ +1- /2, -1](rand() - RAND_MAX / 2)
の値を持つ符号なし整数の符号なし差になります。[- /2, - /2] の範囲の値。RAND_MAX
RAND_MAX
UINT_MAX
RAND_MAX
UINT_MAX
RAND_MAX
RAND_MAX
RAND_MAX
とにかく、RAND_MAX
署名する必要があるようで、ほとんどの(?)コンパイラはそのように定義していますが、署名する必要があると言う信頼できるソースはありますか? 古い規格?K&R? 別の UNIX 仕様ですか?