【问题标题】:Using strconv for negative hex values in Go在 Go 中将 strconv 用于负十六进制值
【发布时间】:2013-03-18 02:46:51
【问题描述】:

过去一天左右,我一直在无缘无故地使用 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)

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

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

【问题讨论】:

    标签: hex go


    【解决方案1】:

    这是设计使然:http://golang.org/src/pkg/strconv/itoa.go?s=628:668#L8

    您可能想要转换为 uint64:

    package main
    
    import (
        "fmt"
        "strconv"
    )
    
    func main() {
        i := -1
        fmt.Printf("%x\n", uint64(i))
        fmt.Println(strconv.FormatUint(uint64(i), 16))
    }
    

    【讨论】:

    • 这是一个相当简单的修复,非常完美。我完全忘记了 Go 是开源的,我可以看看发生了什么。谢谢。
    【解决方案2】:

    在十六进制数字上使用负号是完全合理的。我知道在使用汇编时,通常使用实际的位模式来表示您以十六进制表示的寄存器来表示符号。然而 Go 并不知道你正在这样做。 Go 的格式化函数也没有像在 CPU 寄存器中那样支持十六进制值。此外,位模式将根据寄存器大小(16 对 32 对 64 和大端对小端)而有所不同。您会将它们存储在其中。因此,基础不足以按照您想要的方式打印它们。您需要编写自己的格式库,支持您要表示的寄存器类型的格式。

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 2018-04-26
      • 2014-11-30
      • 2015-02-11
      • 2011-04-19
      • 1970-01-01
      • 2016-06-02
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多