易截截图软件、单文件、免安装、纯绿色、仅160KB

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
  
 
 


相关文档:

C编译基础

int main(int argc,char *argv[])
argc(argument count):参数的个数;
argv(argument value):参数值
argv[0] :文件名
argv[1]:第一个参数,argv[2];第二个参数,以此类推。
编译C
1 单源程序到可执行程序
            编译     & ......

C++ interview C/C++的堆栈,内存分配

C/C++的堆栈,内存分配
2008年12月02日 星期二 11:51
一、一个经过编译的C/C++的程序占用的内存分成以下几个部分:
1、栈区(stack):由编译器自动分配和释放 ,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成。其操作方式类似于数据结构中的栈。
2、堆区(heap) :一般由程序员手动申请以及释 ......

C++与C混合编程(转)

(转)C++中extern “C”含义深层探索
 
 
1.引言
  C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象&rdquo ......

一些常见的c/c++笔试题

1.下面哪种代码风格更好,why?
A .   if ('A' == a)
       {a++;}
B.    if( a == 'A')
       {a++;}
答案:A,如果把==错写成=,因为编译器不允许对常量赋值,容易差错。
2.#define MUTI(x) (x*x)
 int i=3,j, ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号