Указатель с приведением типа - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Имеются строки кода внутри функции: uint32_t Address - передаваемый параметр ...
uint32_t size = 0;
size = * (uint16_t *) (Address + 2);
size |= (*(uint16_t *) (Address + 4)) << 16;
... Внимание вопрос : что делает конструкция * (uint16_t *), что к чему приводиться и на кого указывает?

Решение задачи: «Указатель с приведением типа»

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;
}

Объяснение кода листинга программы

  1. Объявление и инициализация переменной test типа union test_t.
  2. Вложенный тип inner_t содержит две переменные: u16 и u32 типа uint16_t и uint32_t соответственно.
  3. Переменная test содержит массив символов arr размером в sizeof(inner_t).
  4. Массив arr содержит старшие и младшие два байта переменной u32 из вложенного типа inner_t.
  5. В функции main() инициализируют u32 из test значением 67305985.
  6. Затем из массива arr извлекают два байта, которые являются младшими двумя байтами u32 и сохраняют их в переменной size.
  7. Далее, из массива arr извлекают два байта, которые являются старшими двумя байтами u32 и сохраняют их в переменной tmp.
  8. Затем, tmp объединяют с size и получают исходное значение u32 равное 67305985.
  9. В конце функции main(), выводят значение переменной size и tmp на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы