Читал просто как-то про union и геморой с выравниваниями. Вот с тех пор (uchar *) и пользую... Решил спросить - может у кого опыт применения в реальной жизни есть.
Да, вроде как если платформа такая злобная, что адресовать умеет только по 4-хбайтной границе, только сдвиганием в явном виде можно получить куски. Но так не узнаешь, что там реально в памяти в каком порядке.
если знать как байты (2ух или четырёх или восьмибайтного инта хранятся )
то присваиваеш в нулевой области (на 256) уникальные байты а потом по известному адрессу читаеш как инт и смотриш что за число прочиталось из этого понятно станет младшие впереди , старшие впереди , или как в сфэйлившем по этому 32битном pdp11(который был биг эндиан на 16битах и убейся об стену от произвола и сиюминутного решения на 32 битах) или вообще перестановка 8 элиментов(их как раз 8!) - вдуг у этого конкретного имбедеда так НУЖНО.
по анси вроде гарантируется тока непрерывность памяти которая достаточна для хранения 2в 16 различных состояний хоть гигабайт на инт и битики размазаны в художественном беспорядке.
ок . фишка про которую считаю важно помнить и знать что нашлись идиоты и/или практическая необходимость скрестить 2 разных направления размещения старшей и младшей половины при разбещении 4 байт.
и всё таки pdp11 вроде старший байт слова хранил по меньшему адресу
короче
если 4 байта в арабской записи по основанию 256 записать как
x01x02x03x04 то в памяти оно лежало как (x02x01x04x03 либо x03x04x01x02) в отличии от чистого младшие вперёд(BE?) (x04x03x02x01) и чистого старшие раньше(x01x02x03x04)
sizeof(char) по стандарту 1, sizeof от массива размера N N*sizeof от элемента, так что это уже проблемы компилятора, как он будет доставать тебе байт, пусть сдвиги вставляет.
В arm нельзя читать невыровненное четырёхбайтное значение (на самом деле и в x86, хоть формально и можно, но лучше не надо), а байт можно считать по любому адресу.
Существует ненулевая вероятность, что char занимает не один байт.
число бит в байте не играет роли. Union будет работать, даже если в байте 6 или 66 бит. Дело в том, что sizeof(char) === 1 по определению. При этом, sizeof(int) указывает длину int в char'ах, если в int 100 бит, а в char 66 бит, то sizeof(int) == 2. И моя структура будет работать правильно. Как компилятор будет доставать 66и битные char'ы - его проблемы, но дырок между ними НЕ будет, потому union будет выдавать то, что есть.
Иногда во время чтения лоровского /d/, у меня складывается впечатление, что это норкоманы барыжат веществами, обмениваясь стеганографическими сообщениями..