是否可以从预处理器转换为数组?
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;
}
我正在尝试将预处理器转换为数组,但我不确定是否可行,
例如我定义的地方: 编号 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;
}