Ваш код опирается на поведение, определяемое реализацией, поэтому невозможно предсказать, что вы увидите, не зная специфики системы, в которой он работает:
- Размер
struct ztest
может включать заполнение char
может быть подписано или без знака - Байты
uint16_t
могут храниться в виде с прямым порядком байтов или с прямым порядком байтов
Похоже, что ваша система добавляет один байт заполнения к struct ztest
, использует подписанные char
s и сохраняет uint16_t
с самым старшим байтом по младшему адресу.
значение 0x17
- это «мусор» из байта заполнения.Значение 0x88
получает знак расширения для печати в виде знака int
, что приводит к 0xFFFFFF88
распечатке.