相关疑难解决方法(0)

对于常量表达式和其他表达式,编译器的评估是否有所不同

为什么下面的代码无法编译?

package main

import (
    "fmt"
    "unsafe"
)

var x int = 1

const (
    ONE     int = 1
    MIN_INT int = ONE << (unsafe.Sizeof(x)*8 - 1)
)

func main() {
    fmt.Println(MIN_INT)

}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

main.go:12:常量2147483648溢出int

以上陈述是正确的.是的,2147483648溢出int(在32位架构中).但是班次操作应该导致负值,即-2147483648.

但相同的代码工作,如果我将常量更改为变量,我得到预期的输出.

package main

import (
    "fmt"
    "unsafe"
)

var x int = 1

var (
    ONE     int = 1
    MIN_INT int = ONE << (unsafe.Sizeof(x)*8 - 1)
)

func main() {
    fmt.Println(MIN_INT)

}
Run Code Online (Sandbox Code Playgroud)

evaluation bit-manipulation bit-shift go bitwise-operators

4
推荐指数
1
解决办法
450
查看次数

Golang:on-purpose int overflow

我正在使用哈希函数murmur2返回给我一个uint64.

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

因为我对数字本身不感兴趣,只是对二进制值感兴趣(因为我将它用作检测唯一性的id(我的值为~1000值,64位散列对我来说足够了)我想int64通过"只是"改变类型将其转换为.

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

integer-overflow type-conversion go

3
推荐指数
1
解决办法
983
查看次数

Go允许算术运算溢出而不是抛出异常是预期的行为吗?

我正在将一些Go代码移植到Rust,我意识到在乘法过程中发生溢出时Rust会慌乱,而Go允许溢出发生。

下面的测试代码不会引起溢出,但是会打印出减少的值。(通过以下网址测试:https : //play.golang.org/

func main() {
    fmt.Println("test\n")
    var key uint64 = 15000;

    key = key*2862933555777941757 + 1

    fmt.Println(key)
}
Run Code Online (Sandbox Code Playgroud)

integer-overflow go

-3
推荐指数
1
解决办法
111
查看次数