Сначала, конечно, вы можете ввестиdef packed_t
для любого целочисленного типа, который вы
хочу; typedef должен быть виден везде, где используется packed_t
,
однако.
Во-вторых, word >> (bytenum << 3)
- это немного запутанности. Что ты
хочу word >> (bytenum * 8)
или даже лучше:
return (word >> (bytenum * CHAR_BIT)) & ((1 << CHAR_BIT) - 1);
(Трудно сказать, какое здесь лучшее решение: приведенное выше выражение
дает переносимость даже машинам, где байты не 8 бит, но
подвыражение справа от &
довольно неясно и, безусловно,
достойный комментарий.)
Наконец: мы должны прочитать что-нибудь в заголовке. Если вы пытаетесь
вернуть значение байта, как если бы это был байт со знаком, тогда вы будете
нужен дополнительный код, чтобы справиться с этим. Для классического 32 бит два
дополнить машину, будет работать следующее:
int tmp = word >> (bytenum * 8);
if ( (tmp & 0x80) != 0 )
tmp |= 0xFFFFFF80;
else
tmp &= 0x7F;
return tmp;
Более переносимо (не та портативность для машин, которые не 2-х
очень важно дополнить 8-битными байтами), вам нужно написать:
int tmp = (word >> (bytenum * CHAR_BIT)) & ((1 << CHAR_BIT) - 1);
if ( tmp > SCHAR_MAX )
tmp -= UCHAR_MAX + 1;
return tmp;
Но это также зависит от того, что действительно требуется. Значение nth
Байт зависит от фактического представления целых чисел в аппаратных средствах.
код выше игнорирует это и возвращает младший байт как байт 0, а не
обязательно первый байт. Если вы действительно хотите n-й байт какой-то
типа штамповки требуется:
return *(reinterpret_cast<signed char*>( &word ) + bytenum);
Без дополнительной информации о том, что требуется, трудно сказать
какой правильный ответ должен быть.