Размещение в памяти битовых полей структур
От: slava_phirsov Россия  
Дата: 30.10.09 17:59
Оценка:
Доброго времени суток!
Вот такой вопрос: необходимо записать в отдельные группы битов отдельные числа (например, при создании заголовка MP3-файла ). Используем C++, так что в теории можно и с bitset поизвращаться. А если вот так:

// Предполагается, что это - 16-разрядное число,
// нам нужно записать данные в его младшие 5 бит, в следующие за ними 7 бит,
// и в старшие 4 бита
typedef usigned short WORD;
typedef struct Foo
{
 WORD bar: 5; // Младшие 5 бит
 WORD baz: 7; // Следующие 7 бит
 WORD bah: 4; // Старшие 4 бита
};

Foo foo;
foo.bar = 7;
foo.baz = 19;
foo.bah = 3;

WORD foo1 = (WORD)foo; // Забираем данные в "нормальную" переменную типа WORD


Такое возможно, или оно не будет компилиться/работать/переноситься (например, из-за гемора с big и little endian)?
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re: Размещение в памяти битовых полей структур
От: Alexander G Украина  
Дата: 30.10.09 20:35
Оценка: 1 (1)
Здравствуйте, slava_phirsov, Вы писали:


_>Такое возможно, или оно не будет компилиться/работать/переноситься (например, из-за гемора с big и little endian)?


http://rsdn.ru/forum/cpp/3389756.1.aspx
Автор: Bell
Дата: 14.05.09

http://rsdn.ru/forum/cpp/3390803.1.aspx
Автор: z00n
Дата: 15.05.09


_>WORD foo1 = (WORD)foo; // Забираем данные в "нормальную" переменную типа WORD


А такого каста не бывает.
Русский военный корабль идёт ко дну!
Re[2]: Размещение в памяти битовых полей структур
От: slava_phirsov Россия  
Дата: 01.11.09 17:11
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>А такого каста не бывает.


Да, верно, писал сразу в форум, без проверки на компилируемость. Ну через указатель void* преобразуем — не проблема!
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[2]: Размещение в памяти битовых полей структур
От: slava_phirsov Россия  
Дата: 01.11.09 17:18
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>http://rsdn.ru/forum/cpp/3389756.1.aspx
Автор: Bell
Дата: 14.05.09

AG>http://rsdn.ru/forum/cpp/3390803.1.aspx
Автор: z00n
Дата: 15.05.09


Спасибо, вопрос, отпадает. Жаль, я надеялся, что C++ (как язык поддерживащий работу на самом низком уровне) позволяет такие штуки. Видно, не судьба.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[3]: Размещение в памяти битовых полей структур
От: Alexander G Украина  
Дата: 02.11.09 12:26
Оценка:
Здравствуйте, slava_phirsov, Вы писали:

_> Ну через указатель void* преобразуем — не проблема!


Кастом указателей? Это в ограничения 3.10/15 вписывается?
Русский военный корабль идёт ко дну!
Re[4]: Размещение в памяти битовых полей структур
От: slava_phirsov Россия  
Дата: 07.11.09 17:10
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Кастом указателей? Это в ограничения 3.10/15 вписывается?


х.з., не могу похвастаться хорошим знанием стандарта (ибо: 1.компиляторов соответствующих стандарту на 100% не существует; 2.прочитавшего текст стандарта полностью и до конца можно сразу класть в НИИ Сербского на обследование ). GCC 4.1.2 без замечаний принимает вот такое:


#include <iostream>
#include <iomanip>

using namespace std;

typedef unsigned WORD;

typedef struct Foo
{
 WORD bar: 4;
 WORD baz: 4;
 WORD bah: 8;
};

int main(int argc, char* argv[])
{
    Foo foo;
    foo.bar = 0xF;
    foo.baz = 0xA;
    foo.bah = 0x3F;
    
    WORD foo2 = *(
        static_cast<WORD*>(
            static_cast<void*>(&foo)
        )
    );
    
    cout << hex << foo2 << endl;
    
    return 0;
}


и на выходе дает 3a3faf

Впрочем, вопрос уже отпадает — по причинам, описанным в этой же теме выше.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[5]: Размещение в памяти битовых полей структур
От: byleas  
Дата: 07.11.09 17:56
Оценка:
Здравствуйте, slava_phirsov, Вы писали:

_> GCC 4.1.2 без замечаний принимает вот такое:

А зачем такие страшные касты, когда есть [без]именные объединения (union'ы)? Вопрос риторический, т.к. тема исчерпана, судя по всему )
Re[5]: Размещение в памяти битовых полей структур
От: Alexander G Украина  
Дата: 07.11.09 20:46
Оценка: +1
Здравствуйте, slava_phirsov, Вы писали:

AG>>Кастом указателей? Это в ограничения 3.10/15 вписывается?


_> х.з., не могу похвастаться хорошим знанием стандарта (ибо: 1.компиляторов соответствующих стандарту на 100% не существует; 2.прочитавшего текст стандарта полностью и до конца можно сразу класть в НИИ Сербского на обследование ). GCC 4.1.2 без замечаний принимает вот такое:


3.10/15 это strict aliasing rule.
см http://rsdn.ru/forum/cpp/2630988.aspx
Автор: McSeem2
Дата: 23.08.07
, например.
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.