gpt4 book ai didi

c++ - Ruby 模仿 C 整数数据类型和 union

转载 作者:行者123 更新时间:2023-11-28 04:29:13 25 4
gpt4 key购买 nike

我正在尝试用 Ruby 制作一个 Chip-8 模拟器,因为我的 friend 以前用 C++ 做过,但我偶然发现了一些问题,请注意,我对 Ruby 只了解一些知识,我认为这个项目会是提高我这门语言技能的好方法。

我读过有关 Marshal 类的内容,但我完全不知道如何使用它。 http://hackage.haskell.org/package/ruby-marshal-0.1.2/docs/Data-Ruby-Marshal-Int.html

基本上 chip-8 操作码是 int16,但我需要获取指令的低位和最高位,以便正确解释它。在 C++ 中,他使用一个 union 和基本的 int 数据类型,如下所示

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

我如何模仿特定的 uint8_t 和 uint16_t 类型?我不介意 union 不得不用 union 换取其他东西。

这也是使用和管理内存的最佳方式吗?我实际上不知道下面的代码是否正确并且可以编译,因为我只能访问记事本 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

最佳答案

按位运算可以得到一个16位字的高低字节:

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

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

反过来:

opcode = (high_byte << 8) | low_byte

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

这种方法在 C++ 中也可以说更好,因为 union 依赖于系统字节序(从技术上讲,它首先是一个非标准扩展,尽管受到流行编译器的广泛支持)。

关于c++ - Ruby 模仿 C 整数数据类型和 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53375662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com