STM32中的if语句判断32位变量不正确

2020-01-11 18:14发布

本帖最后由 SUPER_CRJ 于 2018-1-12 11:14 编辑

使用芯片STM32F10X系列时,发现下列问题:
        typedef union
        {
                u8 IndexLen8[2048]; // 可正常读出,不可写入
                u16 IndexLen16[1024];  // 1024个16位
        }_Flash_High_Density_TypeDef;
#define HighDensity_FlashPage(x)    ((_Flash_High_Density_TypeDef *) (0x08000000+x*0x800))
#define L_APP_SIZE_H                      HighDensity_FlashPage(6)->IndexLen16[1]   // 这个的值为:0xFFFF
#define L_APP_SIZE_L                      HighDensity_FlashPage(6)->IndexLen16[2]    // 这个的值为:0xFFFF

#define STM32FlashMemorySize ( ( unsigned short int *) (0x1FFFF7E0))  // 这个指针值是:64

发现:使用下面语句,出的结果是我想要的。也就是会retrun FAIL
if( (u32)(( L_APP_SIZE_H<<16 ) + L_APP_SIZE_L ) >=  (u32)( (*STM32FlashMemorySize)*1024 ) )  //
        {
                return FAIL;  
        }
但是:使用下面,就不会
if( (( L_APP_SIZE_H<<16 ) + L_APP_SIZE_L ) >=  ( (*STM32FlashMemorySize)*1024 ) )  //
        {
                return FAIL;  
        }
这是为什么?

最新结果:谢谢大家,就是符号位的问题,也感谢shangdawei的编译器解析,因为没有加强制转换默认为有符号数:于是0xFFFFFFFF这个数,实际上就是最小的有符号的数,而程序的本意是无符号的判断
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
Error.Dan
1楼-- · 2020-01-12 08:42
输出预处理文件直接看到底什么类型,那一堆宏谁有心情慢慢看。。。
zhugean
2楼-- · 2020-01-12 13:22
(( L_APP_SIZE_H<<16 ) + L_APP_SIZE_L )是有符号的,所以它是-1,所以不行
zhugean
3楼-- · 2020-01-12 15:12
stm32是32位的,所以默认整型提升是int型,是有符号的
shangdawei
4楼-- · 2020-01-12 18:02
在C语言中,当一个无符号数和一个有符号数进行比较运算时,有符号数会被隐含的转换成无符号数,并假设这两个数都是非负数,然后进行比较运算。
SUPER_CRJ
5楼-- · 2020-01-12 18:56
 精彩回答 2  元偷偷看……
ddcour
6楼-- · 2020-01-12 23:44
shangdawei 发表于 2018-1-12 11:11
在C语言中,当一个无符号数和一个有符号数进行比较运算时,有符号数会被隐含的转换成无符号数,并假设这两 ...

C基础不错哦!

一周热门 更多>