无法解决“警告:从'int'转换为'long unsigned int'”

时间:2016-11-22 04:32:07

标签: c gcc warnings unsigned

当我编译More on this in this article,一个非常标准的随机数生成器时,我不断遇到一些我需要的代码问题。

  

在函数'init_genrand'中:

     

警告:从'int'转换为'long 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年开始计算出来的,现在有人会抓住这个并修复它。我怎么解决这个问题?或者让我的编译器停止哭泣?

2 个答案:

答案 0 :(得分:1)

您需要将mti的类型更改为unsigned intunsigned long int

static unsigned int mti = N+1;

因为mti会在您的指定表达式中提升为unsigned long

答案 1 :(得分:0)

我相信,问题出现在代码的下面部分

var headingText = $('h2').text();
var newText = ( headingText.replace(/\|[^]*$/, ' <span>$&</span>') );
$('h2.heading').html(newText)


html
<h2 class="heading">foobar|foo</h2>

第一部分 (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti); ^ 将生成(1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30))类型的结果,而unsigned long的类型为mti

根据Additive运算符的语义,章节§6.5.6

  

如果两个操作数都具有算术类型,则执行通常的算术转换   它们。

根据§6.3.1.8/ p1中提到的规则,

RHS操作数int被提升为mti(来自unsigned long

  
      
  • 否则,如果具有无符号整数类型的操作数的等级大于或等于   等于另一个操作数的类型的等级,然后是操作数   有符号整数类型转换为带有unsigned的操作数的类型   整数类型。
  •   

导致警告。

解决方案:您可以将int设为mti