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条回答
shangdawei
1楼-- · 2020-01-11 18:21
 精彩回答 2  元偷偷看……
落叶知秋
2楼-- · 2020-01-11 22:28
符号问题?
javenreal
3楼-- · 2020-01-12 02:47
如果 L_APP_SIZE_H<<16的值默认类型是int,并且最高位是1,就变成负数了吧?
styleno1
4楼-- · 2020-01-12 03:41
隐式类型转换的问题,用到的立即数最好指定类型。
shangdawei
5楼-- · 2020-01-12 05:14
  1. #include <stdint.h>
  2. #define FAIL 0UL
  3. #define SUCCESS 1UL
  4. typedef uint8_t u8;
  5. typedef uint16_t u16;
  6. typedef uint32_t u32;

  7. typedef union
  8. {
  9.   u8 IndexLen8[ 2048 ];      // 可正常读出,不可写入
  10.   u16 IndexLen16[ 1024 ];    // 1024个16位
  11. } _Flash_High_Density_TypeDef;

  12. #define HighDensity_FlashPage( x ) ( ( _Flash_High_Density_TypeDef * ) ( 0x08000000 + x * 0x800 ) )
  13. #define L_APP_SIZE_H HighDensity_FlashPage( 6 )->IndexLen16[ 1 ]    // 这个的值为:0xFFFF
  14. #define L_APP_SIZE_L HighDensity_FlashPage( 6 )->IndexLen16[ 2 ]    // 这个的值为:0xFFFF

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

  16. u32 foo( void )
  17. {
  18.   if ( ( u32 )( ( L_APP_SIZE_H << 16 ) + L_APP_SIZE_L ) >= ( u32 )( ( *STM32FlashMemorySize ) * 1024 ) )    //
  19.   {
  20.     return FAIL;
  21.   }

  22.   if ( ( ( L_APP_SIZE_H << 16 ) + L_APP_SIZE_L ) >= ( ( *STM32FlashMemorySize ) * 1024 ) )    //
  23.   {
  24.     return FAIL;
  25.   }

  26.   if ( ( u32 )( ( L_APP_SIZE_H << 16 ) + L_APP_SIZE_L ) >= ( ( *STM32FlashMemorySize ) * 1024 ) )    //
  27.   {
  28.     return FAIL;
  29.   }

  30.   if ( ( ( L_APP_SIZE_H << 16 ) + L_APP_SIZE_L ) >= ( u32 )( ( *STM32FlashMemorySize ) * 1024 ) )    //
  31.   {
  32.     return FAIL;
  33.   }

  34.   return SUCCESS;
  35. }
复制代码
shangdawei
6楼-- · 2020-01-12 06:37
 精彩回答 2  元偷偷看……

一周热门 更多>