Adres wskaźnika do unsigned short

0

Witam!

Mam strukture, gdzie jedno pole to:

uint16_t addr; // musi byc to uint16_t

Musze tam wpisać adres, przykładowo:

int value;

Mam zapewnione że adres jest mniejszy od 65535 niezależnie od architektury.

int value = 0;

uint16_t addr = static_cast<uint16_t>(&value); // invalud static_cast from type 'int*' to type 'uint16_t'

Zdaję sobie sprawe, że przestrzeń adresacji jest większa, ale jak już wpomniałem, mam zapewnione że adresy są mniejsze.

Jak to zapisać poprawnie w c++?

2

static_cast<uint16_t>(reinterpret_cast<ptrdiff_t>(&value))

albo samo reinterpret_cast<ptrdiff_t>(&value)

Oczywiście jeśli masz gwarancję, że adres będzie tej wielkości to może po prostu uzyj ptrdiff_t

3

lub automagicznie:

uint16_t addr = (uint16_t)&value;

Przy czym jeżeli tak się nie da (adres jest 32 bitowy) to kompilator będzie protestować: http://ideone.com/Qx4OQX

0

Dzięki!
Zostaję przy motywie:

kq napisał(a):

static_cast<uint16_t>(reinterpret_cast<ptrdiff_t>(&value))

Procesor różnie, 16bit, 32bit, 64bit.
Kompilator czepia się czegoś takiego:

typ nazwa = (typ)cosik;

To jest motyw typowy dla C, C++ już ma fochy ;)

Głównie chodzi o adres pola w strukturze, gdzie strukturę rzutuje na 0.

0

Jasne, ale właśnie mi o to chodzi, wpisać bez marudzenia kompilatora adres x-bitowy do uint16_t ;)

3

Głównie chodzi o adres pola w strukturze, gdzie strukturę rzutuje na 0.

http://en.cppreference.com/w/cpp/types/offsetof

0
kq napisał(a):

Głównie chodzi o adres pola w strukturze, gdzie strukturę rzutuje na 0.

http://en.cppreference.com/w/cpp/types/offsetof

Dzięki, nie pomyślałem o tym makrze ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1