我正在尝试将前处理器转换为数组,但是我不确定是否有可能,
例如,我定义了: 号码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]
答案 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;
}