警告:有符号移位结果(0x1F0000000)需要34位来表示,但'int'只有32位

时间:2013-05-14 11:08:20

标签: ios sqlite

编译reMail项目后没有错误,其中一个警告是:

  

remail-iphone / sqlite3 / sqlite3.c:18703:15:签名移位结果   (0x1F0000000)需要34位来表示,但'int'只有32位   位

即。以下代码中的(0x1f<<28)

  if (!(a&0x80))
  {
    a &= (0x1f<<28)|(0x7f<<14)|(0x7f);
    b &= (0x7f<<14)|(0x7f);
    b = b<<7;
    a |= b;
    s = s>>11;
    *v = ((u64)s)<<32 | a;
    return 7;
  }

为iOS(32位)终止此警告的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

针对iPhone的reMail似乎使用旧版本的SQLite(3.6.15)。如果我没有弄错,以下提交应该可以解决这个问题:http://www.sqlite.org/src/info/587109c81a9cf479?sbs=0

if (!(a&0x80))
{
    /* assert( ((0xFF<<28)|(0x7f<<14)|(0x7f))==0xf01fc07f ); */
    a &= 0xf01fc07f;
    b &= (0x7f<<14)|(0x7f);
    b = b<<7;
    a |= b;
    s = s>>11;
    *v = ((u64)s)<<32 | a;
    return 7;
}

但是,可能会出现此问题的其他代码部分。上面提到的链接显示了util.c中的两个实例,但由于sqlite.c是“SQLite中许多单独的C源文件的合并”,因此您可能会发现其他事件。 也许reMail也适用于SQLite的最新版本......