1

在编译没有错误的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 位)消除此警告的正确方法是什么?

4

1 回答 1

1

reMail for iPhone 似乎使用的是旧版本的 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 一起使用......

于 2013-05-14T11:18:45.707 回答