4 подписанных байта упакованы в 32-битный без знака - PullRequest
0 голосов
/ 06 сентября 2011
// Declaration of data type where 4 bytes are packed into an unsigned.   
int xbyte(packed_t word, int bytenum);

int main()
{
    int bytenum = 0;
    typedef unsigned packed_t;
    packed_t word;
}

// Extract byte from word, return as signed integer.
int xbyte(packed_t word, int bytenum)
{
    // Failed attempt at xbyte
    return ( word >> (bytenum << 3)) & 0xff;
}

Я не уверен, как объявить pack_t в этом вопросе. Я должен использовать прототип сверху. Как слово вступает в игру? Я потерялся, это часть домашнего задания.

Ответы [ 3 ]

2 голосов
/ 06 сентября 2011

У вас уже есть строка typedef.Сделайте это первой строкой этого куска кода, и все готово.Суть в том, что имя typedef ed должно быть видно везде, где вы его используете.

1 голос
/ 06 сентября 2011

Сначала, конечно, вы можете ввести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);

Без дополнительной информации о том, что требуется, трудно сказать какой правильный ответ должен быть.

0 голосов
/ 06 сентября 2011

возможно, союз будет полезен здесь

union packed_t
{
    unsigned int unsignedInt;
    char signedChar[4];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...