有没有一种方法可以让两个大小不同的变量共享一个内存地址,而不必将它们声明为指针?

时间:2018-12-02 01:38:16

标签: c++ z80

我正在做一个个人项目,一个模拟器。假设有两个寄存器H和L,每个寄存器长1个字节。因此我们可以用一个字节写入H或L。但是,某些指令要求您将两个字节写入H和L或HL。第一个字节到H,第二个字节到L。根据我的实现方式,有些事情很难实现。

所以我的想法是让HL是一个两个字节的单词。但是,仍然存在H和L变量,它们分别与HL的第一个字节和HL的第二个字节共享相同的地址。

我可以做指针,但是我真的不想将我所有的寄存器都声明为指针。

我当时想的是工会,像这样:

union {
    BYTE H;
    WORD HL;
}

但是后来我不知道如何将L作为第二个字节放入其中。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

您可以这样:

union
{
    struct
    {
        BYTE L, H;
    } b;

    WORD HL;
} u;

一些编译器将允许您执行此操作,尽管它是非标准的:

union
{
    struct
    {
        BYTE L, H;
    };

    WORD HL;
} u;

答案 1 :(得分:1)

这样的工会怎么样?

union {
 BYTE asBytes[2];
 WORD asWord; 
}

然后,您可以通过asBytes[0]访问H,通过asBytes[1]访问L或以asWord访问HL。

答案 2 :(得分:0)

  

有没有办法让两个大小不同的变量共享一个内存   地址而不声明它们为指针?

我相信您可以在没有指针,没有共享内存且不需要类型绑定的情况下实现所需的“行为”。

请考虑以下课程。注意,在函数中定义了用户定义类型的行为。

class ML // msByte and lsByte
{
 private:
    BYTE m_bytes[2];    // this data will be 2 * sizeof(BYTE) 

 public:
    ML() = default; // does nothing. ?or do you need to initialize these?
    ~ML() = default; // does nothing unless you want it to

    // extract one or the other byte - consider 

    BYTE lsByte() { return m_bytes[0]; } // index 0/1 
    BYTE msByte() { return m_bytes[1]; } //    fix based on endianess


    // extract the two bytes by summing, 
    //    I prefer bit shifting and or'ing

    WORD ML() { return ( add m_bytes[0] and (256*m_bytes[1]) into WORD }

    // or maybe   ( m_bytes[0] | (m_bytes[1] << 8)); )// fix based on endianess

    void ML( BYTE ls, BYTE ms)
    {   // fix index based on endianess
        m_bytes[0] = ls;   
        m_bytes[1] = ms; 
    } 

    void ML( WORD w)
    {   // fix shifting based on endianess
        ML ( (w & 0xff), ((w >> 8) & 0xff) ) // invoke ML (BYTE, BYTE)
        //        lsbyte      msbyte     
    } 
};