数据按位赋值 至0 至1

由于编译器默认signed int即32位有符号整数类型,而1<<31实际为0x80000000,
这样就有可能改写了符号位(最高位)
依此类推,(2<<30),(3<<29)...等都会出现编译警告问题.
解决办法为: ((unsigned int)1<<31),((unsigned int)2<<30),...

点击查看代码
#include "stdio.h"
unsigned int  flag_InitChangeMCUData = 0xffffffff ;
unsigned char i = 0 ;
int main(void)
{
     for(i=0;i<32;i++)
     {
         flag_InitChangeMCUData &= ~(0x01<<i);// 将不需要读取的参数值 标志位至 0
         printf("%d: 0x%x  ",i,flag_InitChangeMCUData);
         if((i%4)==0)      printf("\n");
     }
     printf("\n/*****************************************************************/\n");
     for(i=0;i<32;i++)
     {
         flag_InitChangeMCUData |= 0x01<<i; //如果超时,将超时标志位至1
         printf("%d: 0x%x  ",i,flag_InitChangeMCUData);
         if((i%4)==0)      printf("\n");
     }
     printf("\n/*****************************************************************/\n");
     for(i=0;i<32;i++)
     {
         if(i==31 )
	  flag_InitChangeMCUData &= ~0x80000000;// 将不需要读取的参数值 标志位至 0
	 else
          flag_InitChangeMCUData &= ~(0x01<<i);// 将不需要读取的参数值 标志位至 0
         printf("%d: 0x%x  ",i,flag_InitChangeMCUData);
         if((i%4)==0)      printf("\n");
     }
     printf("\n/*****************************************************************/\n");
     for(i=0;i<32;i++)
     {
         if(i==31 )
	  flag_InitChangeMCUData |= 0x80000000;//如果超时,将超时标志位至1
	else
          flag_InitChangeMCUData |= 0x01<<i; //如果超时,将超时标志位至1
         printf("%d: 0x%x  ",i,flag_InitChangeMCUData);
         if((i%4)==0)      printf("\n");
     }
     printf("\n/*****************************************************************/\n");
}
posted @ 2023-04-17 15:47  franks123  阅读(37)  评论(0编辑  收藏  举报