當我編譯mt19937ar.c,一個非常標準的隨機數生成器時,我不斷從一些我需要的代碼中獲取問題。不能解決「警告:從'int'轉換爲'long unsigned int'」
在函數 'init_genrand':
警告:轉換從 'INT' '長UNSIGNED INT' 可以改變結果的
/* Period parameters */
#define N 624
#define M 397
#define MATRIX_A 0x9908b0dfUL /* constant vector a */
#define UPPER_MASK 0x80000000UL /* most significant w-r bits */
#define LOWER_MASK 0x7fffffffUL /* least significant r bits */
static unsigned long mt[N]; /* the array for the state vector */
static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */
/* initializes mt[N] with a seed */
void init_genrand(unsigned long s)
{
mt[0]= s & 0xffffffffUL;
for (mti=1; mti<N; mti++) {
mt[mti] =
(1812433253UL * (mt[mti-1]^(mt[mti-1] >> 30)) + mti);
/* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
/* In the previous versions, MSBs of the seed affect */
/* only MSBs of the array mt[]. */
/* 2002/01/09 modified by Makoto Matsumoto */
mt[mti] &= 0xffffffffUL;
/* for >32 bit machines */
}
}
具體的符號,誤差與
mt[mti] =
(1812433253UL * (mt[mti-1]^(mt[mti-1] >> 30)) + mti);
我試過通過
mt[mti] = (long unsigned int)
(1812433253UL * (mt[mti-1]^(mt[mti-1] >> 30)) + mti);
這真的沒有什麼意義,但我只是想做點什麼。這個代碼是從1997年開始的 - 現在有人會抓住它並修復它。我該如何解決這個問題?或讓我的編譯器停止對它的哭泣?
怎麼樣'30UL'晉升爲
unsigned long
? –@SouravGhosh什麼是'30UL'? – 8protons
使整數常量被視爲'unsigned long'而不是默認'int'。 –