我正在尝试在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代码输出正确的{{ {1}})。为什么会这样?
CONTEXT:在VM的内存中设置单词的功能。经过测试和工作。
0xffff
答案 0 :(得分:1)
memoryPointer
可能有类型[]byte
,在这种情况下,您需要在执行位移之前将内存值转换为uint16:
func DereferenceWord(addr uint32) uint16 {
return uint16(memoryPointer[addr]) | uint16(memoryPointer[addr+1])<<8
}
在当前代码中,位移溢出字节类型,这意味着你总是留下0。