故意的 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
我正在使用哈希函数 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