我正试图在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, 0xff和0x0000 (我的VM中指向值0xffff的地址)进行测试时,Go代码只输出0xff (C代码输出正确的0xffff)。为什么会这样?
上下文:在VM的内存中设置一个单词的函数。测试和工作。
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
}
}发布于 2018-06-01 17:24:28
memoryPointer可能有[]byte类型,在这种情况下,您需要在执行位移位之前将内存值转换为uint16:
func DereferenceWord(addr uint32) uint16 {
return uint16(memoryPointer[addr]) | uint16(memoryPointer[addr+1])<<8
}在当前代码中,位移位溢出了字节类型,这意味着您将始终保留0。
https://stackoverflow.com/questions/50648229
复制相似问题