【问题标题】:Deciphering a queer compiler warning about unsigned decimal constant解读关于无符号十进制常量的酷儿编译器警告
【发布时间】:2010-05-24 17:54:08
【问题描述】:

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

warning: this decimal constant is unsigned only in ISO C90

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

#define trp_prio_get(a_type, a_field, a_node)               \
    (2654435761*(uint32_t)(uintptr_t)(a_node))

我不确定那个奇怪的数字在那里做什么,但我认为它的存在是有充分理由的,所以我只想不理它。我确实想修复警告 - 知道为什么编译器会说它仅在 ISO C90 中是无符号的吗?

编辑:我使用的是 gcc-4.1

【问题讨论】:

  • 告诉我们您使用的是什么编译器会很有帮助。
  • 警告的存在也是有原因的。它告诉您文字的类型已从一个 C 版本更改为另一个,因此无论原始开发人员提出的任何充分理由现在都可能是错误的,这可能会以有趣的方式破坏您的代码。

标签: c compiler-warnings


【解决方案1】:

尝试将那个数字替换为

2654435761u

强制它未签名。

【讨论】:

    【解决方案2】:

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

    在 Knuth 的“计算机艺术”中 编程”,第 6.4 节,a 乘法散列方案是 作为一种写散列的方式引入 功能。密钥乘以 2^32 (2654435761) 的黄金比例 产生一个哈希结果。

    由于 2654435761 和 2^32 没有 共同因素 乘法产生一个完整的 将键映射到哈希结果 没有重叠。这个方法很好用 好吧,如果键的值很小。 如果 密钥的高位不同。原样 在所有乘法中为真, 上位数字的变化不 影响低位数字 乘法结果。

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

    【讨论】:

    • 数字的黄金比例究竟是什么意思? (并且 OP 询问警告,尽管我确信这个数字的背景是值得赞赏的。)
    • 奇数不共享属性“无公因数”吗? 2^n-1 是 3 * 5 * 17 * 157 * 65537,看不到两个。 ;)
    • @dash-tom-bang:不;任何是这些因子的倍数的数字都将共享一个公因子。 (所以是 3、5 等的任意倍数。)
    • 所以引用的文本应该读到“因为 [0,2^32) 范围内没有其他值有 2654435761 作为因素”?
    【解决方案3】:

    我认为它是无符号的,因为它大于 2,147,483,647,这是长有符号整数的最大大小,因此为了避免回绕,它将其视为无符号并发出警告。

    【讨论】:

      【解决方案4】:

      问题是这个常数2654435761大于2^31。这意味着在旧的编译器中,它实际上会变成一个负值作为有符号常量。

      现在,在这种情况下没关系,因为乘以一个无符号值,它将被转换回无符号,并且会发生正确的事情。

      【讨论】:

        猜你喜欢
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 2015-12-04
        • 2011-01-22
        相关资源
        最近更新 更多