http://ideone.com/EX0VAP
cały problem polega na tym, że nie rozumiesz jak to działa.
Chodzi o to, by dostęp był jak najszybszy. W przypadku małych obiektów to ie jest problem, bo zawsze odczytać i zapisać trzeba ten sam rozmiar pamięci. W przypadku większych obiektów chodzi o wyrównanie adresu, by dostęp do pamięci nie wymagał odczytu dwóch komórek pamięci.
Obecnie pamięć ram tak naprawdę nie jest adresowana z dokładnością bajta, ale 4 bajtów (lub nawet więcej), a kontroler pamięci pozwala widzieć procesorowi pojedyncze bajty. Więc wyrównanie int-a do równego adresu pozwala na optymalizację dostępu pamięci i jednego odczytu pamięci zamiast dwóch odczytów.
W przypadku char nie ma tego problemu, zawsze odczytujesz jedną komórkę, więc można je upakować bez straty na wydajności.
Disclaimer: jest to nieco bardziej skomplikowane (i pewnie coś pokręciłem), ale ogólny koncept.problem powinieneś zrozumieć.