У меня есть 64-битное слово без знака и структура с битовой подстановкой, которые оба приведены ниже. Структура находится внутри объединения, которое содержит несколько (если быть точным, 11), но немного структур.
uint64_t final_data_word;
#pragma pack(1)
typedef struct control_block_format_1_s
{
uint8_t block_type_field:8;
uint8_t control_word_0:7;
uint8_t control_word_1:7;
uint8_t control_word_2:7;
uint8_t control_word_3:7;
uint8_t control_word_4:7;
uint8_t control_word_5:7;
uint8_t control_word_6:7;
uint8_t control_word_7:7;
}control_block_format_1_t;
typedef union
{
control_block_format_1_t *cb_1;
control_block_format_2_t *cb_2;
control_block_format_3_t *cb_3;
control_block_format_4_t *cb_4;
control_block_format_5_t *cb_5;
control_block_format_6_t *cb_6;
control_block_format_7_t *cb_7;
control_block_format_8_t *cb_8;
control_block_format_9_t *cb_9;
control_block_format_10_t *cb_10;
control_block_format_11_t *cb_11;
}block_payload_union_t;
#pragma pack()
Я хочу интерпретировать 64-разрядные слова в 64-разрядном слове как поля в структуре. Поэтому я выполняю следующую операцию
block_payload_union_t *block_pload =(block_payload_union_t*)malloc(sizeof(block_payload_union_t*));
block_pload->cb_1 = (control_block_format_1_t*)(&final_data_word);
, но я не получаю ожидаемые значения для последнего поля в моемструктура. Может кто-нибудь видеть какие-либо проблемы с тем, что я делаю? Любые предложения или комментарии приветствуются.
@ Джонатан Я добавил следующие комментарии к своему коду.
printf ("sizeof (union) =%zu \ n ", sizeof (block_payload_union_t));
printf ("sizeof (cb1) =% zu \ n", sizeof (control_block_format_1_t));
printf ("FDW = 0x% .16lx \ n", final_data_word);
// printf ("* bp-> llp = 0x% .16lx \ n", * block_pload-> llp);
printf ("bp-> cb1-> block_type_fld = 0x% .2X \ n", block_pload-> cb_1-> block_type_field);
printf ("bp-> cb1-> control_word_0 = 0x% .2X \ n", block_pload-> cb_1-> control_word_0);
printf ("bp-> cb1-> control_word_1 = 0x% .2X \ n", block_pload-> cb_1-> control_word_1);
printf ("bp-> cb1-> control_word_2 = 0x% .2X \ n", block_pload-> cb_1-> control_word_2);
printf ("bp-> cb1-> control_word_3 = 0x% .2X \ n", block_pload-> cb_1-> control_word_3);
printf ("bp-> cb1-> control_word_4 = 0x% .2X \ n", block_pload-> cb_1-> control_word_4);
printf ("bp-> cb1-> control_word_5 = 0x% .2X \ n", block_pload-> cb_1-> control_word_5);
printf ("bp-> cb1-> control_word_6 = 0x% .2X \ n", block_pload-> cb_1-> control_word_6);
printf ("bp-> cb1-> control_word_7 = 0x% .2X \ n", block_pload-> cb_1-> control_word_7);
Вывод, полученный без #pragma pack (), был следующим
конечное слово данных 0x1e00000000000000
sizeof (union) = 8
sizeof (cb1) = 9
FDW = 0x1e00000000000000
bp-> cb1-> block_type_fld = 0x00
bp-> cb1-> control_word_0 = 0x00
bp-> cb1-> control_word_1 = 0x00
bp-> cb1-> control_word_2 = 0x00
bp-> cb1-> control_word_3 = 0x00
bp-> cb1-> control_word_4 = 0x00
bp-> cb1-> control_word_5 = 0x00
bp-> cb1-> control_word_6 = 0x1E
bp-> cb1-> control_word_7 = 0x78
Вывод с помощью #pragma pack () был следующим
конечное слово данных 0x1e00000000000000
sizeof (union) = 8
sizeof (cb1) = 8
FDW = 0x1e00000000000000
bp-> cb1-> block_type_fld = 0x00
bp-> cb1-> control_word_0 = 0x00
bp-> cb1-> control_word_1 = 0x00
bp-> cb1-> control_word_2 = 0x00
bp-> cb1-> control_word_3 = 0x00
bp-> cb1-> control_word_4 = 0x00
bp-> cb1-> control_word_5 = 0x00
bp-> cb1-> control_word_6 = 0x00
bp-> cb1-> control_word_7 = 0x0F
Это похоже на вывод, который вы получили на машине Джонатана.