2014-11-02 76 views
3

神奇的数字在这种情况下0x9e3779b9,这台10是2654435769.没有任何理由为什么代码为什么升压幻数::在十六进制指定hash_combine

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); 

使用十六进制表示而不是基地10代表?如果2654435769替代代码中的0x9e3779b9,功能是否保持相同?

+0

类似问题:http://stackoverflow.com/questions/4948780/magic-number-in-boosthash-combine – 2014-11-04 03:57:56

回答

5

文字是文字,同一文字的不同表示是......字面上相同。

但是,表达式(文字或不是)也有类型

等价的字面意思应该是2654435769u(注意类型后缀使它成为unsigned)。

看这个简单的测试Live On Coliru

  • 0x9e3779b9具有类型unsigned int(32位)和
  • 2654435769long(64位)
  • 2654435769u具有类型unsigned int(32位)再次键入

正如你所看到的,十六进制表示有利于无符号,十进制表示有利于有符号,使得类型变大¹。


¹native整型尺寸实现定义

(除了类型,人们可以说,也许,也许,位分配是十六进制,八进制或最终二进制表示稍微更加明显)