在 Go 中对负十六进制值使用 strconv

过去一天左右,我一直在无缘无故地使用 Go 构建一个汇编程序,以便我可以熟悉该语言。这是我使用 Go 的第一个真正的程序,所以我预料到了问题,但是我一次又一次地出现了一致的错误。我只是想出了在其他情况下修复它的其他hacky方法,但这次我想我需要一个答案,所以我觉得我实际上做对了。


基本上,我必须解析大量的字节值。其中一些是有符号字节,所以 -1 = 0xFF 等等。在计算标签的地址时,我需要找到它与当前地址的偏移量。以下代码是我用来获取偏移量的精简版基本版本:


//  lbladdr holds the target label address

//  address holds current address in memory

//  label[x] holds the offset

if address > lbladdr {

    lbladdr -= address

}

label[x] = strconv.FormatInt(int64(lbladdr), 16)

这适用于正值,但是当我得到一个负地址(地址 > lbladr)时,我得到的是 -2,而不是像 FE 这样的值。我不明白为什么标准库会在十六进制数后附加一个负号,而且我在文档中找不到任何关于它的内容。我已经看了很多其他地方,但我似乎也找不到任何有同样问题的人。


我希望这只是一个简单的修复。


富国沪深
浏览 341回答 2
2回答

Cats萌萌

在十六进制数上使用负号是完全合理的。我知道在使用汇编程序时,通常使用实际的位模式作为您以十六进制表示的寄存器来表示符号。然而,Go 并不知道你在这样做。go 的格式化函数也不是为了支持十六进制值而编写的,因为它们在 CPU 寄存器中。此外,位模式将根据寄存器大小(16 对 32 对 64 和大对小端)而有所不同。你会把它们储存在里面。所以基地不足以按照你想要的方式打印它们。您将需要编写自己的格式库,该库支持您要表示的寄存器类型的格式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go