Как объединить два `uint8`s в` uint16` с помощью операторов сдвига битов в Go? - PullRequest
0 голосов
/ 01 июня 2018

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

1 Ответ

0 голосов
/ 01 июня 2018

memoryPointer, вероятно, имеет тип []byte, и в этом случае вам необходимо преобразовать значение памяти в uint16 перед выполнением сдвига битов:

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

В вашем текущем коде сдвиг битов переполняетсятип байта, означающий, что вы всегда останетесь с 0.

...