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
相关文档:
VB
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
MSComm1.CommPort = i1
MSComm1.PortOpen = True
MSComm1.InputMode = comInputModeBinary
MSComm1.InBufferCount = 0
& ......
int main(int argc,char *argv[])
argc(argument count):参数的个数;
argv(argument value):参数值
argv[0] :文件名
argv[1]:第一个参数,argv[2];第二个参数,以此类推。
编译C
1 单源程序到可执行程序
编译 & ......
def login():
print 'login'
def logout():
print 'logout'
controllers = {
'in': login,   ......
哈哈!有幸在某网站发现这篇文章,读罢,觉得蛮有道理,发来大家一起共勉之
总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。
一家之言,欢迎拍砖哈。
1、可以考虑先学习C.
大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望 ......
C6000系列DSP的硬件资源为高性能提高了必要条件,TI公司也配合C6000推出了世界上第一个效率可达70%~80%的汇编语言级C编译器,它产生的代码平均效率是以往DSP编译器的3倍,如何理解并充分利用这些有利资源,使代码达到所期望的性能,是本章的主题。
① 第一阶段:属于纯C阶段,此时不需要 ......