CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

谁给说说char,BYTE,DWORD,int,long它们之间的关系和区别吧!!!

楼主flyingjm((我要找工作))2004-09-04 20:11:21 在 VC/MFC / 基础类 提问

如题  
  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

相关问题

  • byte[] String char[] 区别如何?
  • byte和char有什么区别?
  • char[] 同 byte[] 有什么区别?
  • byte* pBuffer = new byte[1024] 和 char* pBuffer = new char[1024]又什么区别?
  • unsign char和byte类型有什么区别
  • char 和 TCHAR 区别
  • byte--char
  • char * 和char[]的区别
  • BYTE 和 byte 什么区别??
  • char * m_dd 和 (char *) char 有区别吗?

关键词

  • 编译器
  • 函数
  • 数据
  • llength
  • clpackage
  • endsetpacklen
  • lbuflen
  • setdword
  • lcommand
  • llenwordpos

得分解答快速导航

  • 帖主:flyingjm
  • Mackz
  • lyzcom
  • maxcode
  • cchuocp
  • Mackz
  • jacky1019

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo