Указатель с приведением типа - 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
на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д