C中常量参与运算的问题

最近在开发中,对常量参与运算时候,出了几个问题,特记录如下:

1.例子一(KEIL-51)

   unsigned char recsum,xorsum;

   recsum == 0xFF; 

   xorsum == 0x00;

   if(recsum != (xorsum-1))  //这时候不相等

   if(recsum != (unsigned char)(xorsum-1))   //这时候相等

 

  2.例子二(KEIL-51)

   UINT8   Buffer[2];

   UINT16 TempNum;

   TempNum=Buffer[0]<<8 | Buffer[1];   //正确

 

  3.例子三

  例如在KEIL--51中
  long totalsec;
  totalsec =  60* 60 * 24 * 365;      //结果只保留2个字节,错误  0x3380
  totalsec =  60ul* 60 * 24 * 365;  //正确  0x1E13380

  例如在KEIL_ARM
  long totalsec;
  totalsec =  60* 60 * 24 * 365;      //结果只保留4个字节,正确0x1E13380
  totalsec =  60ul* 60 * 24 * 365;  //正确0x1E13380

 

理解三点,对以上问题就好理解了。

 

1. 对于常数,编译器默认的是int类型

 

2. 对于8位单片机,int占2个字节,对于32位机,int占4个字节

 

3. 对于运算表达式来说,以运算中数据类型最长的为标准自动转换

   自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则: 
    1.若参与运算量的类型不同则先转换成同一类型,然后进行运算。
    2.转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。
    3.所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
    4.char型和short型参与运算时,必须先转换成int型。

例如 

例一:KEIL-51(常量int--2个字节)

表达式(xorsum-1),xorsum为unsigned char,1为int, 这样将xorsum变量类型自动转换成int,运算结果为int

 

  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值