是否可以从预处理器转换为数组?

Is possible cast from a preprocessor to array?

我正在尝试将预处理器转换为数组,但我不确定是否可行,

例如我定义的地方: 编号 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 array[4] where array[0] = 0x44, array[1] = 0x33, array[2] = 0x22, array[3] = 0x11

可能吗?

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

这在任何方面都不是真正的演员表。您已经定义了一个常量并根据该常量计算数组的值。请记住,在这种情况下,预处理器只是进行搜索和替换,没有什么聪明的。

还有,你的班次方向错了。将 int 转换为 uint8_t 时保留最后(最右边)8 位,而不是第一个(最左边)。

是的,您正在将 int 转换为 uint8_t。唯一的问题是,当您进行转换时,结果将不适合您要投射到的类型,并且信息将会丢失。

您的 uint8_t 转换只是占用了最低有效字节。这就是为什么你在第一种情况下得到 11 而在其他情况下得到 0 的原因......因为你向左移动会在最右边的位置留下 0。

需要几个实现:

  • uint8_t 屏蔽掉数据的最低有效字节。这意味着您必须将数据右移到最低有效字节,而不是将数据左移。
  • 0x44332211 是一个 整数常量 ,而不是 "preprocessor"。它是 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;
}