【问题标题】:On-purpose int overflow故意int溢出
【发布时间】:2016-04-14 18:38:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: go type-conversion integer-overflow


    【解决方案1】:

    您可以简单地使用类型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
    

    【讨论】:

    • 好的,是的,我对类型转换的工作方式有错误的印象,感谢您澄清事情
    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多