C++ 如何访问32位寄存器阵列以及作为单独操作读取/写入16位上段和下段

C++ 如何访问32位寄存器阵列以及作为单独操作读取/写入16位上段和下段,c++,arrays,pointers,struct,C++,Arrays,Pointers,Struct,我有一个连续的内存区域,包含320位,分为10个独立的“寄存器” 创建内存区域后,我将返回第一个寄存器元素的地址 此时,我想从逻辑上映射一个32位结构的数组,该数组包含32位数字的高位和低位部分,然后遍历该数组并分别写入上段和下段 我已经有一个功能,将分裂和输入32位的数字分成两个16位的部分,使用位旋转方案 我的问题是,在相邻区域上覆盖结构数组的最佳方式是什么 我之所以需要这样做,是因为我正在使用外部库与嵌入式设备通信,而库没有32位的概念,甚至底层设备也将数据存储在32位寄存器中。首先,请确

我有一个连续的内存区域,包含320位,分为10个独立的“寄存器”

创建内存区域后,我将返回第一个寄存器元素的地址

此时,我想从逻辑上映射一个32位结构的数组,该数组包含32位数字的高位和低位部分,然后遍历该数组并分别写入上段和下段

我已经有一个功能,将分裂和输入32位的数字分成两个16位的部分,使用位旋转方案

我的问题是,在相邻区域上覆盖结构数组的最佳方式是什么


我之所以需要这样做,是因为我正在使用外部库与嵌入式设备通信,而库没有32位的概念,甚至底层设备也将数据存储在32位寄存器中。

首先,请确保您的结构是由编译器表示的32位。检查sizeof(struct xxx)==4,并使用编译器打包选项直到它是(从技术上讲,这确保struct是4个字符,但应该足够好)

第二种方法是创建一个指向struct类型对象的指针,然后将内存块的地址分配给它。要做到这一点,您需要一个老式的类型转换操作

类似于(请注意,其中的顺序是高和低,以及其中的字节将因硬件而异)


首先,确保您的结构是由编译器表示的32位。检查sizeof(struct xxx)==4,并使用编译器打包选项直到它是(从技术上讲,这确保struct是4个字符,但应该足够好)

第二种方法是创建一个指向struct类型对象的指针,然后将内存块的地址分配给它。要做到这一点,您需要一个老式的类型转换操作

类似于(请注意,其中的顺序是高和低,以及其中的字节将因硬件而异)


数组已经是连续的。为什么你需要在任何东西上覆盖任何东西?只要有你的结构数组;完成。还是给了你内存块?在这种情况下,如果您不介意打破严格的别名规则,您可以使用一些特殊的强制转换。打包您的结构声明,并将连续内存的开头强制转换为指向其中一个结构的指针。库设置内存空间;我得到了一个地址,我不必担心释放内存,因为库会处理这个问题。我只是想弄清楚,若将该地址分配给结构数组的开头,然后使用指针算法将每个结构的“光标”上移,会不会导致任何编译器问题,或者引入一个很难找到的bug,若它能工作的话。数组已经是连续的。为什么你需要在任何东西上覆盖任何东西?只要有你的结构数组;完成。还是给了你内存块?在这种情况下,如果您不介意打破严格的别名规则,您可以使用一些特殊的强制转换。打包您的结构声明,并将连续内存的开头强制转换为指向其中一个结构的指针。库设置内存空间;我得到了一个地址,我不必担心释放内存,因为库会处理这个问题。我只是想弄清楚,若将地址分配到结构数组的开头,然后使用指针算法将每个结构的“光标”上移,会不会导致任何编译器问题,或者引入一个很难找到的bug(若可行的话),Skippy?作为旁注…我使用的boost integer类型uint16\u t比我使用的short要好得多-它通常是16位,但并不总是。事实上,没有保证正确的类型。为什么会有C约定,Skippy?作为一个补充说明…我使用boost integer类型uint16_t比我使用short要好得多-它通常是16位,但并不总是。事实上,没有保证正确的类型。
typedef struct {
   short high;
   short low;
} hilo;

hilo *registers = (hilo *) memPtr;