Я пытаюсь разработать игрушечную архитектуру процессора в Go, чтобы изучать и знакомиться с языком, чем я занимался раньше в 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
(адрес в моей виртуальной машине указывает на значение 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
}
}