gpt4 book ai didi

go - 如何在 Go 中使用位移运算符将两个 `uint8` 连接成一个 `uint16`?

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:34 26 4
gpt4 key购买 nike

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

uint16_t connect(uint8_t a, uint8_t b)
{
return (uint16_t) a | (uint16_t) b << 8;
}

进入这段 Go 代码:

func DereferenceWord(addr uint32) uint16 {
return uint16(memoryPointer[addr]) | uint16(memoryPointer[addr + 1] << 8)
}

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

CONTEXT:在虚拟机内存中设置一个词的函数。已经过测试和工作。

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
}
}

最佳答案

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

func DereferenceWord(addr uint32) uint16 {
return uint16(memoryPointer[addr]) | uint16(memoryPointer[addr+1])<<8
}

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

关于go - 如何在 Go 中使用位移运算符将两个 `uint8` 连接成一个 `uint16`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50648229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com