Ruby模仿C Integer数据类型和联合

时间:2018-11-19 13:27:21

标签: c++ c ruby emulation

我正在尝试用Ruby创建一个Chip-8仿真器,就像我的朋友以前使用C ++一样,但是我偶然发现了一些问题,请记住,我对Ruby还是只有一点了解,我认为这个项目会是提高我的语言能力的好方法。

我已经读过元帅课,但是我不知道如何使用它。 http://hackage.haskell.org/package/ruby-marshal-0.1.2/docs/Data-Ruby-Marshal-Int.html

所以基本上8芯片的操作码是int16的,但是我需要获取指令的最低位和最高位,以便我可以正确地解释它。在C ++中,他使用并集和基本int数据类型进行了此操作

struct Instruction {
    union {
        uint16_t opcode;
        struct {
            uint8_t lower;
            uint8_t upper;
        } bytes;
    };

如何模仿特定的uint8_t和uint16_t类型?我不介意工会将工会换成其他东西。

这也是使用和管理内存的最佳方法吗?我实际上不知道下面的代码是否正确,会编译,因为我只能访问记事本atm

class Memory
    @memory = Hash.new(Array.new)
    @memory[:system] = Array.new(0x200, 0)
    @memory[:rom] = Array.new(0xCA0, 0)
    @memory[:internal] = Array.new(0x5F, 0)
    @memory[:refresher] = Array.new(0xF0, 0)

    @stack = Array.new(0) #Gotta stick with push/pop
end

class Chip8
    def initialize
        @memory = Memory.new

1 个答案:

答案 0 :(得分:1)

您可以通过按位操作获得16位字的高字节和低字节:

high_byte = opcode >> 8
low_byte = opcode & 0xFF

以上假设opcode已被限制在16位无符号整数的范围内。

相反:

opcode = (high_byte << 8) | low_byte

以上假设high_bytelow_byte被限制在8位无符号整数范围内。

这种方法在C ++中也可以说是更好的方法,因为联合依赖于系统的字节顺序(并且从一开始就是技术上的非标准扩展,尽管受到流行的编译器的广泛支持)。