On-purpose int overflow

╄→гoц情女王★ 提交于 2019-12-18 09:05:06

问题


I'm using the hash function murmur2 which returns me an uint64.

I want then to store it in PostgreSQL, which only support BIGINT (signed 64 bits).

As I'm not interested in the number itself, but just the binary value (as I use it as an id for detecting uniqueness (my set of values being of ~1000 values, a 64bit hash is enough for me) I would like to convert it into int64 by "just" changing the type.

How does one do that in a way that pleases the compiler?


回答1:


You can simply use a type conversion:

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

Output:

18446744073709551615 -1

Converting uint64 to int64 always succeeds: it doesn't change the memory representation just the type. What may confuse you is if you try to convert an untyped integer constant value to int64:

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

This is a compile time error as the constant value 0xffffffffffffffff (which is represented with arbitrary precision) does not fit into int64 because the max value that fits into int64 is 0x7fffffffffffffff:

constant 18446744073709551615 overflows int64


来源:https://stackoverflow.com/questions/34704843/on-purpose-int-overflow

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!