结构的数据到联合
Data of a struct into a union
我已经宣布下一个联盟:
typedef union
{
struct
{
uint32_t data;
};
uint8_t w[4];
} xxx_data_t
我正在尝试通过SPI 访问内存,它只有1Byte 的输入容量。
我想输入变量 data
,我已经将 32 位 data
变量分解为 4 个 8 位变量(每个 1Byte),从而形成 w[4]
数组。
我的问题是:这有效吗?这会分解我的 32 位变量?
示例
我声明xxx_DATA_t my_variable
。
my_variable.data=300
十六进制为 0x12C。数组会是 my_variable.w[4]=[0,0,1,44]
??
数据(32 位)= 300 = 0x 00 00 01 2C
w(4 位)====== = 0x [0] [0] [1] [44]
谢谢大家
我觉得是对的。你可以写一个测试程序来测试一下。
#include<stdio.h>
#include<stdint.h>
typedef union
{
struct
{
uint32_t data;
};
uint8_t w[4];
}data_t;
int main(){
data_t d = {.data = 0x12c};
for(int i = 0; i < 4; i++){
printf("%d\n", d.w[i]);
}
return 0;
}
44
1
0
0
My question is: is this valid?
是的,您可以使用联合在不同类型之间进行类型双关。输入双关 to/from 字符类型(uint8_t
几乎肯定是)总是安全的。 Alignment/padding 在这种特定情况下也不应该成为问题。
请注意,您只能在 C 中执行此操作 - 您 不能 在 C++ 中执行此操作。所以在使用C++进行硬件相关编程之前要三思。
which in hexadecimal is 0x12C. Will the array be my_variable.w[4]=[0,0,1,44]??
这取决于 CPU 字节顺序。 What is CPU endianness?
因此您可以在 Power PC 等 Big Endian 计算机上获取 00 00 01 2C
,或者在 x86 等 Little Endian 计算机上获取 2C 01 00 00
。
至于您实际上想要 的字节序,它是网络 字节序。在 SPI 的情况下,网络字节顺序与您与之通信的部分所期望的字节顺序相同。您必须在数据表中查找它,以防它是一个“哑”部件,如 ADC、显示器或类似部件。如果它是像另一个 MCU 一样的“智能”部分,那么您可以自己指定网络字节顺序。
我已经宣布下一个联盟:
typedef union
{
struct
{
uint32_t data;
};
uint8_t w[4];
} xxx_data_t
我正在尝试通过SPI 访问内存,它只有1Byte 的输入容量。
我想输入变量 data
,我已经将 32 位 data
变量分解为 4 个 8 位变量(每个 1Byte),从而形成 w[4]
数组。
我的问题是:这有效吗?这会分解我的 32 位变量?
示例
我声明xxx_DATA_t my_variable
。
my_variable.data=300
十六进制为 0x12C。数组会是 my_variable.w[4]=[0,0,1,44]
??
数据(32 位)= 300 = 0x 00 00 01 2C
w(4 位)====== = 0x [0] [0] [1] [44]
谢谢大家
我觉得是对的。你可以写一个测试程序来测试一下。
#include<stdio.h>
#include<stdint.h>
typedef union
{
struct
{
uint32_t data;
};
uint8_t w[4];
}data_t;
int main(){
data_t d = {.data = 0x12c};
for(int i = 0; i < 4; i++){
printf("%d\n", d.w[i]);
}
return 0;
}
44
1
0
0
My question is: is this valid?
是的,您可以使用联合在不同类型之间进行类型双关。输入双关 to/from 字符类型(uint8_t
几乎肯定是)总是安全的。 Alignment/padding 在这种特定情况下也不应该成为问题。
请注意,您只能在 C 中执行此操作 - 您 不能 在 C++ 中执行此操作。所以在使用C++进行硬件相关编程之前要三思。
which in hexadecimal is 0x12C. Will the array be my_variable.w[4]=[0,0,1,44]??
这取决于 CPU 字节顺序。 What is CPU endianness?
因此您可以在 Power PC 等 Big Endian 计算机上获取 00 00 01 2C
,或者在 x86 等 Little Endian 计算机上获取 2C 01 00 00
。
至于您实际上想要 的字节序,它是网络 字节序。在 SPI 的情况下,网络字节顺序与您与之通信的部分所期望的字节顺序相同。您必须在数据表中查找它,以防它是一个“哑”部件,如 ADC、显示器或类似部件。如果它是像另一个 MCU 一样的“智能”部分,那么您可以自己指定网络字节顺序。