一尘不染

故意int溢出

go

我正在使用哈希函数murmur2,该函数返回一个uint64

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

因为我对数字本身不感兴趣,但对二进制值(因为我将其用作检测唯一性的ID(我的值集为〜1000个值,一个64位的哈希值对我来说足够了)),我想int64通过“只是”更改类型将其转换为。

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


阅读 241

收藏
2020-07-02

共1个答案

一尘不染

您可以简单地使用类型转换

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

输出:

18446744073709551615 -1

转换uint64int64始终成功:它不会仅更改类型的内存表示。如果您尝试将无类型的整数常量值转换为int64:,可能会使您感到困惑。

i3 := int64(0xffffffffffffffff) // Compile time error!

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

constant 18446744073709551615 overflows int64
2020-07-02