конвертация типов
#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;
}
unsigned long*p = &k;
My h; My* m = &h;
m = reinterpret_cast<My*>(&k);
h=*m;
printf("%drn",h.w1);
Код:
#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;
}
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;
}
Как видно кратчайшая форма в с-стиле: My *h3 = (My*)&k.. Возможно преимущество reinterpret_cast<>() в том, что он легче бросается в глаза, что полезно при опасных операциях.
P.S. В коде, где"%dn" надо писать слеш перед n ( почему-то слеш не отображается в посте).
Цитата: sadovoya
Интересно, есть ли принципиальная разница между приведением через reinterpret_cast<>() и через (void *):
C-like каст - просто начинает перебирать имеющиеся касты (static_cast, reinterpret_cast и т.п.), пока не найдет подходящий. Поэтому в общем случае выбор скорее всего падет на тот же reinterpret_cast, а значит все будет точно так же.
Однако: от программиста остается скрыто, какой именно каст выбран. И в процессе изменения окружающего кода оно ведь может и поменяться, что точно останется скрыто и может повлечь проблемы.