[英]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
十进制的0xF3210123
是4_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.