解密有关无符号十进制常量的奇怪编译器警告

art*_*non 5 c compiler-warnings

这个大型应用程序有一个内存池库,它在内部使用treap来存储内存节点.treap是使用cpp宏实现的,完整的文件trp.h可以在这里找到.当我尝试编译应用程序时,我收到以下编译器警告:

warning: this decimal constant is unsigned only in ISO C90
Run Code Online (Sandbox Code Playgroud)

通过删除部分宏代码并使用反复试验,我终于找到了罪魁祸首:

#define trp_prio_get(a_type, a_field, a_node)               \
    (2654435761*(uint32_t)(uintptr_t)(a_node))
Run Code Online (Sandbox Code Playgroud)

我不确定那个奇怪的数字在那里做什么,但我认为这是有充分理由的,所以我只想不管它.我确实想要修复警告 - 任何想法为什么编译器说它只在ISO C90中无符号?

编辑:我正在使用gcc-4.1

Amb*_*ber 6

2654435761是对应于2 ^ 32的黄金比例数.

在Knuth的"计算机编程的艺术"第6.4节中,引入了乘法散列方案作为写入散列函数的方法.密钥乘以2 ^ 32(2654435761)的黄金比率以产生散列结果.

由于2654435761和2 ^ 32没有共同的共同因素,因此乘法产生密钥到散列结果的完整映射而没有重叠.如果键值很小,则此方法非常有效.如果密钥在高位中变化,则产生错误的散列结果.在所有乘法中都是如此,高位数的变化不会影响乘法结果的低位.

http://www.concentric.net/~Ttwang/tech/inthash.htm


ken*_*ytm 6

尝试用这个号码替换

2654435761u
Run Code Online (Sandbox Code Playgroud)

迫使它未签名.