Ai8051u定义的uint32变量但是实际还是16位?
C251的头文件定义的DEF.H里typedef unsigned long uint32,用来做了事件标志组的变量,
结果逐个位判断时发现到0~15的位的判断有效,后面的就无效了?
编译器的unsigned long实际上还是16位整型吗?
咋判断的呢,上传判断方法。下面这些0x01用1UL
ercircle 发表于 2025-7-18 16:09
咋判断的呢,上传判断方法。下面这些0x01用1UL
左移1相与,逐个位判断是不是1,位越小优先级越高,
找到位号就switch处理对应事件函数,
然后一直循环这样操作达到按优先级处理事件组的后台轮询功能。
AGeek 发表于 2025-7-18 16:39
左移1相与,逐个位判断是不是1,位越小优先级越高,找到位号就switch处理对应事件函数,然后一直循环这样 ...
注意0x01全改为1UL再试下 注意数据类型和强制类型转换
参与运算的数据(包括常量),数据类型必须相同
等号两端数据类型必须相同
多种数据类型参与运算,没有float和负数就都强制转换为unsigned long 这种情况基本都是数据类型没有对齐所致。
举个例子:
u32 a;
u16 b,c;
b = 20000;
c = 20000;
a = b*c;
你会发觉a就是不超过65535,好像是16位的,那是因为b*c的结果就是16位的。
a = (u32)b*c; 这样就能正常了,因为变量已对齐32位的。 梁工 发表于 2025-7-18 18:22
这种情况基本都是数据类型没有对齐所致。
举个例子:
u32 a;
哦哦,原来是这样,这是跟编译器有关系的吗?51的编译器认为一般整型运算结果是16位而不是32位?以前用stm32好像不会这样,是因为stm32编译器是直接用32位存整型?
页:
[1]