繁体   English   中英

32位arm上的Golang无类型int溢出

[英]Golang untyped int overflow on 32-bit arm

我正在尝试在从 C function 返回的 32 位签名 integer 上创建一个开关。 这一切都通过以下方式为 32 位 arm 系统编译: GOARCH=arm GOOS=linux CC="..." go build

我的代码是:

func ResultToString(value C.int) error {
    switch int(value) {
    case 1:
        return nil
    case -1:
        return fmt.Errorf("Unknown")
    case 0xF3210123:
        return fmt.Errorf("Line high")
    }
    return fmt.Errorf("bad value")
}

我收到的错误是: pkg/app/conversions.go:200:7: 0xF3210123 (untyped int constant 4079026467) overflows int

十进制的0xF32101234_079_026_467并且完全适合 32 位1111 0011 0010 0001 0000 0001 0010 0011 但是,这是未签名的表示,当我想要签名的表示时(即-215_940_829 )。

我试图在开关中转换它,但我所有的方法都不起作用(这里尝试使用常量0xF3210124

  • case int(0xF3210124):给出错误cannot convert 0xF3210124 (untyped int constant 4079026468) to type int

我还尝试将其创建为常规var并按照此博客文章中所述的方式进行转换: https://go.dev/blog/constants但这也不起作用:

# Source
var testVal = 0xF3210123
...
case int(testVal):
# Error
cannot use 0xF3210123 (untyped int constant 4079026467) as int value in variable declaration (overflows)

我想直接使用文字来匹配我要实现的规范。 有没有一种方法可以轻松地做到这一点,而我只是想念?

--

起作用的是使用转换后的常量(如下所示)。 但是,我有很多这样的代码,并且再次想使用十六进制文字进行简单的规范匹配。

# Working example
func ResultToString(value C.int) error {
    switch int(value) {
    case 1:
        return nil
    case -1:
        return fmt.Errorf("Unknown")
    case -215_940_829:
        return fmt.Errorf("Line high")
    }
    return fmt.Errorf("bad value")
}

这可以通过对无类型常量的语言规范的特定解释来解释。 看起来0xF3210123被解释为uint32值,然后在编译时转换为int32值时会导致溢出。

但是在运行时转换时它不会这样做。

如此丑陋,但一种解决方法可能是(我没有在 32 位系统上对此进行测试):

var v = 0xF3210124
var x = int32(v)

...

switch ... {
   case x: ...
}

我也尝试了一些事情......这个工作:

const (
        ZERO int32 = 0
        BIG1 = 0xF3210123
        BIG2 = 0xFF00FF00
)

然后:

    case BIG1:
        fmt.Printf("big\n");

听起来你必须想出很多名字,但有些人会说这比到处都有很多未知常数要好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM