하드웨어의 레지스터에 해당하는 구조체가 있습니다.C에서 비트 필드에 액세스
typedef unsigned int uint32;
typedef union A_u{
uint32 words[4];
struct {
uint32 a : 2;
uint32 b : 3;
uint32 unused : 27;
uint32 c : 2;
uint32 d : 3;
uint32 unused0 : 27;
uint32 unused1 : 1;
uint32 e : 1;
uint32 f : 1;
uint32 g : 1;
uint32 h : 1;
uint32 i : 1;
uint32 unused2 : 26;
uint32 reserved6 : 32;
}s;
}A_t;
main()
{
A_t obj;
uint32 val = 1;
memset(&obj, 0, sizeof(A_t));
//fills data
read_data(&obj);
printf("0x%x\n", obj.words[2]);
printf("obj.s.h = %d\n", obj.s.h);
}
출력은
0x80000000에
obj.sh = 1
3 단어가 0x80000000에이지만, obj.sh 내가 할 수없는 오전 1로 표시됩니다 이것을 이해하다. 나는 powerpc에서 이것을 실행하고 있는데, 첫 번째 비트 필드는 최상위 비트이다.
'printf ("sizeof (obj)는 % d 바이트입니다. \ n", sizeof (obj)); - Bitfield 패킹은 매우 컴파일러에 따라 다릅니다 – Roddy
sizeof (obj)는 16입니다. 4 32 비트 워드 – user405369
비트 필드가 서명되지 않았으므로 % d는 % u 여야합니다. 문제의 해결책이 아닐 수도 있습니다. – tinman