首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Go中使用位移位操作符将两个‘into 8’连接成‘into 16’?

如何在Go中使用位移位操作符将两个‘into 8’连接成‘into 16’?
EN

Stack Overflow用户
提问于 2018-06-01 17:13:53
回答 1查看 1.1K关注 0票数 1

我正试图在Go中开发一个玩具CPU架构,以学习并熟悉该语言,这是我以前在C语言中做过的事情。然而,学习过程中的一个部分让我感到惊讶,那就是位操作。特别是,我正在努力实现将两个8位值连接成16位值的问题。我已经翻译了我编写的这个通用C代码:

代码语言:javascript
复制
uint16_t connect(uint8_t a, uint8_t b)
{
    return (uint16_t) a | (uint16_t) b << 8;
}

转到这个Go代码:

代码语言:javascript
复制
func DereferenceWord(addr uint32) uint16 {
    return uint16(memoryPointer[addr]) | uint16(memoryPointer[addr + 1] << 8)
}

至少对我来说,代码似乎是正确的。但是,当用0xff, 0xff0x0000 (我的VM中指向值0xffff的地址)进行测试时,Go代码只输出0xff (C代码输出正确的0xffff)。为什么会这样?

上下文:在VM的内存中设置一个单词的函数。测试和工作。

代码语言:javascript
复制
func SetWord(addr uint32, data uint16) {
    initial := 0
    for i := 0; i < 2; i++ {
        memoryPointer[addr + uint32(i)] = uint8((data >> uint32(initial)) & 0xff)
        initial += 8
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-01 17:24:28

memoryPointer可能有[]byte类型,在这种情况下,您需要在执行位移位之前将内存值转换为uint16:

代码语言:javascript
复制
func DereferenceWord(addr uint32) uint16 {
    return uint16(memoryPointer[addr]) | uint16(memoryPointer[addr+1])<<8
}

在当前代码中,位移位溢出了字节类型,这意味着您将始终保留0。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50648229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档