Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6462
Последний выпуск: 19.06.2015

конвертация типов

7.5K
12 октября 2013 года
diprom
37 / / 15.10.2010
Здравствуйте, можно ли конвертировать long в struct. Пока не получается.

#pragma pack(push,1)
struct My
{
unsigned w1:16;
unsigned w2:4;
unsigned w3:5;
unsigned w4:1;
unsigned w5:1;
unsigned w6:1;
unsigned w7:1;
unsigned w8:1;
unsigned w9:1;
};
#pragma pack(pop,1)

int main()
{
unsigned long k = 3731119652;
My h;
h = reinterpret_cast<My>(k); - не получается скомпилировать
return 0;
}
7.5K
12 октября 2013 года
diprom
37 / / 15.10.2010
Все, сам ответил.

unsigned long*p = &k;
My h; My* m = &h;
m = reinterpret_cast<My*>(&k);
h=*m;
printf("%drn",h.w1);
310
12 октября 2013 года
sadovoya
757 / / 19.11.2005
Интересно, есть ли принципиальная разница между приведением через reinterpret_cast<>() и через (void *):

Код:
#include <cstdio>

struct My
{
    unsigned w1:16;
    unsigned w2:4;
    unsigned w3:5;
    unsigned w4:1;
    unsigned w5:1;
    unsigned w6:1;
    unsigned w7:1;
    unsigned w8:1;
    unsigned w9:1;
};


int main() {

    unsigned long k = 3731119652u;

    My *h = reinterpret_cast<My*>(&k);
    printf("%dn",h->w1);

    My *h2 = (My*)(void *)(&k);
    printf("%dn",h2->w1);

    My *h3 = (My*)&k;
    printf("%dn",h3->w1);

    return 0;
}
На моей платформе во всех случаях поле w1 печатается как 24100. Не являются ли все эти способы одинаково грубыми или есть нюансы?
Как видно кратчайшая форма в с-стиле: My *h3 = (My*)&k.. Возможно преимущество reinterpret_cast<>() в том, что он легче бросается в глаза, что полезно при опасных операциях.


P.S. В коде, где"%dn" надо писать слеш перед n ( почему-то слеш не отображается в посте).
1.8K
22 октября 2013 года
Arkady
153 / / 18.12.2007
Цитата: sadovoya
Интересно, есть ли принципиальная разница между приведением через reinterpret_cast<>() и через (void *):



C-like каст - просто начинает перебирать имеющиеся касты (static_cast, reinterpret_cast и т.п.), пока не найдет подходящий. Поэтому в общем случае выбор скорее всего падет на тот же reinterpret_cast, а значит все будет точно так же.

Однако: от программиста остается скрыто, какой именно каст выбран. И в процессе изменения окружающего кода оно ведь может и поменяться, что точно останется скрыто и может повлечь проблемы.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог