假设我有一个C结构:
typedef struct {
UINT8 nRow;
UINT8 nCol;
UINT16 nData; } tempStruct;
有没有办法将结构的所有3个成员都放在一个32位的单词中,但仍然可以单独访问它们?
答案 0 :(得分:3)
借助union
s?
typedef struct {
UINT8 nRow;
UINT8 nCol;
UINT16 nData;
}
tempStruct;
typedef union {
tempStruct myStruct;
UINT32 myWord;
} stuff;
甚至更好(没有“中间”结构):
#include <stdlib.h>
#include <stdio.h>
typedef union {
struct {
int nRow:8;
int nCol:8;
int nData:16;
};
int myWord;
} stuff;
int main(int args, char** argv){
stuff a;
a.myWord=0;
a.nCol=2;
printf("%d\n", a.myWord);
return 0;
}
答案 1 :(得分:1)
将它称为UINT32怎么样?这不像C是类型安全的。
tempStruct t;
t.nRow = 0x01;
t.nCol = 0x02;
t.nData = 0x04;
//put a reference to the struct as a pointer to a UINT32
UINT32* word = (UINT32 *) &t;
printf("%x", *word);
然后,您可以通过取消引用指针来获取结构的值作为32位字。您的系统的细节可能很重要,但是......如果我在我的机器上运行它,word
的值是0x00040201 ---也就是说,字段的顺序相反。如果您尝试将其序列化到另一个系统,我认为不一定会出现这种情况,因此它不可移植。
如果你想将它实际存储为32位整数然后单独引用字段,为什么不呢?
UINT32 word = 0x01020004;
然后在其他地方......
UINT8* row(UINT32 word) {
return (UINT8 *) &word + 3;
}
UINT8* col(UINT32 word) {
return ((UINT8 *) &word) + 2;
}
UINT16* data(UINT32 word) {
return ((UINT16 *) &word);
}
宏将有助于便携式字节顺序。
答案 2 :(得分:0)
是的,您可以在C中使用bit fields来执行此操作。类似的东西:
typedef struct {
unsigned nRow : 8;
unsigned nCol : 8;
unsigned nData : 16;
} tempStruct;
如果您还想控制内存布局,可能需要查看#pragma pack
。一些编译器可以使用非便携式选项。
答案 3 :(得分:0)
typedef struct {
int nRow:8;
int nCol:8;
int nData:16; } tempStruct;
nRow只需8位,nCol需要8位,nDate需要16位。
这对你有用。
我刚刚编写了示例程序来查看它的大小
#include<stdio.h>
typedef struct {
int nRow:8;
int nCol:8;
int nData:16; } tempStruct;
typedef struct {
int nRow;
int nCol;
int nData; } tempStructZ;
int main(void) {
printf("%d\n", sizeof(tempStruct));
printf("%d\n", sizeof(tempStructZ));
return 0;
}
输出: 4 16