2016-11-22 130 views
1

當我編譯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年開始的 - 現在有人會抓住它並修復它。我該如何解決這個問題?或讓我的編譯器停止對它的哭泣?

+0

怎麼樣'30UL'晉升爲unsigned long? –

+0

@SouravGhosh什麼是'30UL'? – 8protons

+0

使整數常量被視爲'unsigned long'而不是默認'int'。 –

回答

1

您需要更改的mti類型unsigned intunsigned long int

static unsigned int mti = N+1; 

因爲mti將在您指定表達式

+0

工作!謝謝! – 8protons

0

我相信,問題是在代碼

(1812433253UL * (mt[mti-1]^(mt[mti-1] >> 30)) + mti); 
               ^

第一部分下面的部分,(1812433253UL * (mt[mti-1]^(mt[mti-1] >> 30))會產生unsigned long類型的結果,並且是mtiint類型。

作爲每加法運算符的語義,章§6.5.6

如果兩個操作數具有算術類型,通常的算術轉換是在 它們執行。

的RHS操作數,mti被提升到unsigned long(從int),根據在§6.3.1.8/ P1提到

  • 否則規則,如果具有無符號整數類型操作數具有等級大於或等於其他操作數的類型的等級,則具有 有符號整數類型的操作數被轉換爲具有無符號整數類型的操作數的類型。

引起警告。

解決方案:您可以使mtiunsigned long

+0

我照你最後一句的指示做了,仍然得到相同的編譯器警告 – 8protons

+0

@ 8protons啊,我知道,邏輯是一樣的,但問題出在' mti'是'int'。 –

相關問題