故意的 int 溢出

On-purpose int overflow

我正在使用哈希函数 murmur2,returns 我 uint64

然后我想将它存储在 PostgreSQL 中,它只支持 BIGINT(带符号的 64 位)。

因为我对数字本身不感兴趣,只对二进制值感兴趣(因为我将它用作检测唯一性的 id(我的一组值大约有 1000 个值,64 位哈希对我来说足够了) 我想通过 "just" 更改类型将其转换为 int64

如何以令编译器满意的方式做到这一点?

你可以简单地使用类型 conversion:

i := uint64(0xffffffffffffffff)
i2 := int64(i)
fmt.Println(i, i2)

输出:

18446744073709551615 -1

uint64 转换为 int64 总是成功:它不会仅更改类型而更改内存表示。如果您尝试将无类型整数常量值转换为 int64:

,您可能会感到困惑
i3 := int64(0xffffffffffffffff) // Compile time error!

这是一个编译时错误,因为常量值 0xffffffffffffffff(以任意精度表示)不适合 int64,因为适合 int64 的最大值是0x7fffffffffffffff:

constant 18446744073709551615 overflows int64