So if these variables all hold values in the range of unsigned char (or less), why are they taking up sizeof( int ) bits?

The only thing I can think of is perhaps to avoid the runtime cost of integral promotion when operations are performed on these values? Is integral promotion that costly?? Or an I misisng some more subtle reason?