谁给说说char,BYTE,DWORD,int,long它们之间的关系和区别吧!!!
如题
BYTE ,DWORD,在操作上与int,long有什么区别呢?可以互换吗?
最好详细点,不知道它们该用在什么时候
问题点数:10、回复次数:11Top
1 楼Mackz(在相互)回复于 2004-09-04 21:25:29 得分 1
请看MSDN-->Data type,并结合C语言的基础入门书看。Top
2 楼lyzcom(初学者)回复于 2004-09-04 21:29:38 得分 1
建议最好先看C语言的基础入门材料……Top
3 楼maxcode(人弋石马)回复于 2004-09-04 22:30:20 得分 2
typedef unsigned char BYTE;
typedef unsigned long DWORD;
为了争分
也不择手段了
哈哈
接分
Top
4 楼cchuocp(井底之蛙)回复于 2004-09-04 22:39:29 得分 2
当然不能100%互换。多数时候使用BYTE和LONG的目的是为了程序的可移植性。我们通常使用C编译器是32位的,也就是说int类型是32位的。但还有16位的和64位的编译器。但无论什么编译器,int,long的长度可能不同,但都可以将BYTE,DWORD的长度定义的相同。因此使用BYTE和DWORD能得到移植性更好的程序。
在UNIX/LINUX下,不太用BYTE,DWORD,而是类似的u8_t,u32_t等,不一而足。Top
5 楼crystal521(【云淡风轻】)回复于 2004-09-04 23:06:52 得分 0
MSDNTop
6 楼flyingjm((我要找工作))回复于 2004-09-05 10:49:03 得分 0
C语言中有WORD ,DWORD,BYTE吗?我以为这三个是vc中专有的呢?Top
7 楼flyingjm((我要找工作))回复于 2004-09-05 11:22:52 得分 0
我真被那些类型给搞糊涂了,帮我看看下面的东西吧
class CLpackage
{
priate:
long m_lBufLen;//缓冲区中字节的长度
char m_szBuf[2048];//定义的缓冲区
long lLenWordPos;//报文长度的存放位置
long lPackHeadLen;//报文的全部长度;
。。。。。。。//成员函数
public:
long EndSetPackLen(long lLength=-1);
}
CLpackage::CLpackage()
{
lLenWordPos =0;
lPackHeadLen =10; //报头长度设置为10
InitPack();
}
void CLPackage::InitPack()
{
memset(m_szBuf,0,PACK_BUF_SIZE);
m_lBufLen=0;
}
long CLPackage::SetInt(int iData)
{
return PutVar((char*)&iData,sizeof(int));
}
long CLPackage::SetDword(unsigned long dData)
{
return PutVar((char*)&dData,sizeof(unsigned long));
}
long CLPackage::EndSetPackLen(long lLength)
{
if(lLength==-1)
lLength=m_lBufLen;
lLength-=lPackHeadLen;
memcpy(m_szBuf+lLenWordPos,(char*)&lLength,sizeof(long));
return true;
}
long CLPackage::PutVar(char *szData, long lLength)
{
if(((lLength+m_lBufLen)>PACK_BUF_SIZE)||(szData==NULL))
{
InitPack();
return false;
}
memcpy(m_szBuf+m_lBufLen,szData,lLength);
m_lBufLen+=lLength;
return true;
}
long CLPackage::MakeHead(long lCommand,unsigned long lSque)
{
InitPack();
SetInt(0);
SetInt(lCommand);
SetDword(NULL);
SetDword(lSque);
EndSetPackLen();
return true;
}
这是从别人那里弄来的一个组包和拆包的类,没有什么注释。那些注释是我自己看类后加上去的,也不知道对不对
1。MakeHead()应该用来填充报头的,MakeHead()中最后执行EndSetPackLen()的时候,
lLength=m_lBufLen=8,而lPackHeadLen=10,所以lLength-lPackHeadLen=-2,这样不是把-2填充到存放报长的位置了吗?
2。在MakeHead()中,我不知道SetInt(lCommand);SetDword(lSque);这连个函数中的参数分别代表什么意思?是要填充报头的信息吗?可是我怎么看不像呢?因为lCommand放在缓冲区的前4个字节中,当调用EndSetPackLen()的时候,不又把它给冲了吗?
大家帮着给看看,解决了可以再加分的!!
Top
8 楼Mackz(在相互)回复于 2004-09-05 15:05:21 得分 2
C中没有BYTE、DWORD等,这是在Win32 API里定义的。让你看C的基础书的意思是,真正理解数据类型,可以举一反三,不会为这些小事纠缠。
1.
if(lLength==-1)
lLength=m_lBufLen;
这时lLength != -1
2. 调用EndSetPackLen()的时候,
memcpy(m_szBuf+lLenWordPos,(char*)&lLength,sizeof(long));
是往缓冲区后部填充数据,不会冲掉。Top
9 楼flyingjm((我要找工作))回复于 2004-09-05 20:04:57 得分 0
long EndSetPackLen(long lLength=-1);这个是函数的声明,在没有传参数的时候,默认的是lLength=-1,上面的调用中,EndSetPackLen()中没有参数,所以lLength=-1,
Mackz(在相互)你看错了吧?
另外memcpy(m_szBuf+lLenWordPos,(char*)&lLength,sizeof(long));中lLenWordPos=0,所以还是从缓冲区的头填充数据的吧?
Top
10 楼jacky1019(追风的男子)回复于 2004-09-05 21:43:49 得分 2
建议楼主装个visual assist,把鼠标移到这些数据类型上面就会有它的原始定义了,譬如#define unsigned long DWORDTop
11 楼flyingjm((我要找工作))回复于 2004-09-06 20:11:27 得分 0
终于明白了,第一次想错了,就一直没有转过弯来:(
SetInt(0);//这里已经填充了4个字节了,
SetInt(lCommand);//这添写的是从第五个开始的
SetDword(NULL);
SetDword(lSque);
我把SetInt(0)想成先清空,然后再填写lCommand了,犯了个很低级的错误
不过SetDword()的参数是unsigned long型的,SetDword(NULL)这样是怎么回事?
unsigned long和NULL有什么关系,可以这样赋值吗?Top




