Указатель с приведением типа - C (СИ)
Формулировка задачи:
Имеются строки кода внутри функции:
uint32_t Address - передаваемый параметр
...
...
Внимание вопрос : что делает конструкция * (uint16_t *), что к чему приводиться и на кого указывает?
uint32_t size = 0; size = * (uint16_t *) (Address + 2); size |= (*(uint16_t *) (Address + 4)) << 16;
Решение задачи: «Указатель с приведением типа»
textual
Листинг программы
#include <iostream>
#include <stdint.h>
#pragma pack(push, 1)
union test_t
{
struct inner_t {
uint16_t u16;
uint32_t u32;
} inner;
char arr[sizeof(inner_t)];
} test;
#pragma pack(pop, 1)
int main()
{
// 67108864_10 0000 0100 0000 0000 0000 0000 0000 0000
// + 196608_10 0000 0000 0000 0011 0000 0000 0000 0000
// + 512_10 0000 0000 0000 0000 0000 0010 0000 0000
// + 1_10 0000 0000 0000 0000 0000 0000 0000 0001
// =67305985_10 0000 0100 0000 0011 0000 0010 0000 0001
test.inner.u32 = 67305985;
uint32_t size = 0;
size = *((uint16_t*)(test.arr + 2)); //513_10 = 0000 0010 0000 0001 - младшие два байта test.inner.u32
std::cout << size << std::endl;
uint32_t tmp = (*(uint16_t *) (test.arr + 4)) << 16; //67305472_10 - 0000 0100 0000 0011 0000 0000 0000 0000 - cтаршие два байта test.inner.u32
size |= tmp; //получили исходное число test.inner.u32 = 67305985
std::cout << size << std::endl;
}
Объяснение кода листинга программы
- Объявление и инициализация переменной
testтипаunion test_t. - Вложенный тип
inner_tсодержит две переменные:u16иu32типаuint16_tиuint32_tсоответственно. - Переменная
testсодержит массив символовarrразмером вsizeof(inner_t). - Массив
arrсодержит старшие и младшие два байта переменнойu32из вложенного типаinner_t. - В функции
main()инициализируютu32изtestзначением67305985. - Затем из массива
arrизвлекают два байта, которые являются младшими двумя байтамиu32и сохраняют их в переменнойsize. - Далее, из массива
arrизвлекают два байта, которые являются старшими двумя байтамиu32и сохраняют их в переменнойtmp. - Затем,
tmpобъединяют сsizeи получают исходное значениеu32равное67305985. - В конце функции
main(), выводят значение переменнойsizeиtmpна экран.