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

时间:2019-04-01 23:30:26

标签: c arrays casting preprocessor

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

例如,我定义了: 号码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],其中array [0] = 0x44,array [1] = 0x33,array [2] = 0x22,array [3] = 0x11

有可能吗?

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

3 个答案:

答案 0 :(得分:0)

无论如何,这实际上不是演员。您已经定义了一个常数,并根据该常数计算数组的值。请记住,在这种情况下,预处理器只是简单地进行搜索和替换,没有什么聪明的。

此外,您的转移方向错误。将int转换为uint8_t时,您保留最后(最右边)的8位,而不是第一个(最左边)的位。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

需要一些实现:

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