Возможно ли преобразование из препроцессора в массив? - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь преобразовать препроцессор в массив, но я не уверен, возможно ли это вообще,

Где, например, я определил: Number 0x44332211

Код ниже:

#include <stdio.h>
#include <stdint.h>

#define number 0x44332211

int main()
{

   uint8_t array[4] = {(uint8_t)number, (uint8_t)number << 8,(uint8_t)(number <<16 ),(uint8_t)(number <<24)};

    printf("array[%x] \n\r",array[0]);  // 0x44
    printf("array[%x] \n\r",array[1]);  // 0x33
    printf("array[%x] \n\r",array[2]);  // 0x22
    printf("array[%x] \n\r",array[3]);  // 0x11

    return 0;
}

и я хочу привести его к двум массивам uint8_t [4], где array [0] = 0x44, array [1] = 0x33, array [2] = 0x22, array [3] = 0x11

Возможно ли это?

my output:
array[11]                                                                                                                                      
array[0]                                                                                                                                       
array[0]                                                                                                                                       
array[0]

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

Да, вы разыгрываете int на uint8_t.Единственная проблема заключается в том, что когда вы делаете смены, результат не будет соответствовать типу, к которому вы применяете данные, и информация будет потеряна.вот почему вы получаете 11 в первом случае и 0 в остальных ... потому что ваши сдвиги влево оставляют 0 в крайних правых положениях.

0 голосов
/ 02 апреля 2019

Требуется пара реализаций:

  • uint8_t маскирует младший значащий байт данных.Это означает, что вы должны сдвинуть данные вправо вниз в младший значащий байт, а не сдвинуть данные влево от него.
  • 0x44332211 - это целочисленная константа , а не «препроцессор».Он имеет тип int и поэтому подписан.Вы не должны использовать побитовые операторы для подписанных типов.Легко решается изменением на 0x44332211u с суффиксом без знака.
  • Опечатка здесь: (uint8_t)number << 8.Вы должны сдвинуться, а затем разыграть.Приведения имеют более высокий приоритет, чем сдвиг.

#include <stdio.h>
#include <stdint.h>

#define number 0x44332211u

int main()
{
  uint8_t array[4] = 
  {
    (uint8_t)(number >> 24),
    (uint8_t)(number >> 16),
    (uint8_t)(number >>  8),
    (uint8_t) number 
  };

  printf("array[%x] \n\r",array[0]);  // 0x44
  printf("array[%x] \n\r",array[1]);  // 0x33
  printf("array[%x] \n\r",array[2]);  // 0x22
  printf("array[%x] \n\r",array[3]);  // 0x11

  return 0;
}
0 голосов
/ 02 апреля 2019

На самом деле это не актерский состав.Вы определили константу и вычислите значения массива на основе этой константы.Имейте в виду, что в этом случае препроцессор просто выполняет поиск и замену, ничего умного.

Кроме того, ваш сдвиг не в том направлении.Вы сохраняете последние (самые правые) 8 бит при приведении int к uint8_t, а не первые (самые левые).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...