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
相关文档:
我们已经了解如何定义线程入口点函数、调用系统API创建执行指定函数的线程。本节将揭示这一切在系统内部是如何完成的。
图6-1描述了线程创建并完成初始化后的状态。调用CreateThread会使系统产生一个线程内核对象,其引用计数(Usage count)被初始化为2(创建线程的进程和线程本身都引用了该内核对象),其它属性也完成了 ......
下面列举了一些常见的编译器的调用约定
VC6:
调用约定 堆栈清除 参数传递
__cdecl 调用者 从右到左,通过堆栈传递
__stdcall 函数 ......
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
double a,b,c;
double delta;
double x1,x2;
cout<<"Please input a,b,c:"<<endl;
cin>>a>>b>>c;
if(cin.fail())
{
cout<< ......
(转)C++中extern “C”含义深层探索
1.引言
C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象&rdquo ......
1)a = a + 5; 与 a += 5;的区别。
二者在广义上是等价。D.Ritchie 在C语言中引入复合运算符的主要目的是为了提高编译的效率以产生高质量的执行代码。因为这些运算符的功能基本上都能用一二条机器指令来完成。
2)在C++中long 与 int 的区别
NameDescriptionSize*Range*
char
Character or s ......