在这种情况下的幻数是0x9e3779b9,在10的基数是2654435769.这个代码是否有任何理由
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
使用十六进制表示而不是基数10表示?如果在代码中用2654435769代替0x9e3779b9,那么功能是否会保持相同?
答案 0 :(得分:5)
文字是文字,同一文字的不同表示......字面上相同。
但是,表达式(文字与否)也有 类型 。
等效文字应为2654435769u
(注意类型后缀使其成为unsigned
)。
看看这个简单的测试 Live On Coliru
0x9e3779b9
的类型为unsigned int
(32位)和2654435769
的类型为long
(64位)2654435769u
再次输入unsigned int
(32位)正如你所看到的,十六进制表示有利于无符号,十进制表示有利于签名,使类型更大¹。
¹本机整数大小是实现定义的
(除了类型之外,有人可能会说,或许,在十六进制,八进制或最终二进制表示中,位分布可能会更明显)