Всех приветствую.
Я нашел баг в GCC!!! (хотел засунуть в заголовок, но жалко скора)
В общем, я перестал понимать как работают битовые поля в Си. Вот пример. Есть байтовый массив:
uint8_t b[] = {0x32, 0x1A, 0x01, 0xE6, 0x24, 0x00, 0x22, 0x48 };
натягиваем вот такую структуру на этот массив:
#pragma pack (push, 1)
typedef struct obj_control_502_s
{
unsigned object_id: 8;
unsigned object_length: 7;
unsigned heading: 11;
unsigned speed_abs: 11;
unsigned y_point1: 13;
unsigned x_point1: 13;
unsigned mode_signal1: 1;
obj_control_502_t;
#pragma pack (pop)
obj_control_502_t *c502 = (obj_control_502_t *)b;
Я делаю смелое предположение, что структурка будет плотноупакованной. И нужные мне поля соберутся из нужных мне бит.
Вывожу все это на экран:
printf("ID: %X, LEN: %X, H: %X, SPD: %X, Y: %X, X: %X, mode: %X\n",
c502->object_id,
c502->object_length ,
c502->heading,
c502->speed_abs,
c502->y_point1,
c502->x_point1,
c502->mode_signal1
);
У меня выводится:
32 1A 01 E6 24 00 22 48
ID: 32, LEN: 1A, H: 402, SPD: 139, Y: 1001, X: 1208, mode: 0
И это очевидно неверно!!!
Должно быть: ID: 32, LEN: D, H: 7, SPD: 4C4, Y: 1000, X: 1124, mode: 0
Кто сможет объяснить результат?