我知道:"WORD: A 16-bit unsigned integer.
DWORD: 32-bit unsigned integer.".我发现在win32SDK程序中如果把WORD和DWORD全部换成int程序也能正常运行!那麽为什麽有时候一定要用DWORD?比如:"ar << (WORD)m_nPenWidth;",char和int也有这样的问题,我把TCHAR和UINT换成char和int也是可以的,我认为用DWORD和WORD无疑使程序变得难看,而且不容易理解,我的问题就是什麽情况下一定要用DWORD等而不能用int呢?现在的系统一般不都是32-bit的吗?请指点!我很想知道什麽情况下不能用int?

解决方案 »

  1.   

    再说了,int可以是负数,可WORD和DWORD只能是正数。
    你需要确定数值的范围,然后再决定用什么类型。幸运的话你编程随便乱换都可以,不过一到实际使用环境中出了错你还坚持自己没错。
    例如一个18bit的DWORD你换成WORD不就被截断了吗?
    一个返回值返回DWORD,这个返回值比WORD的最大值还大。你用一个WORD的去接收会有什么后果?
      

  2.   

    一个返回值返回DWORD,这个返回值比WORD的最大值还大。你用一个WORD的去接收会有什么后果?当然这个值如果小于WORD的最大值,还是可以正常使用的。但这是不确定的(不确定的错误比一般的错误难查,因为时好时不好),如果你编程经验少,那么你很可能有一种惯性思维,就是使用正确的值去测试,这样当然没有问题。但实际运行的程序确不能保证这样。
      

  3.   

    多谢指点!那深入浅出中有一段笔宽:ar << (WORD)m_nPenWidth为什麽转化成WORD?
      

  4.   

    定义WORD、DWORD其实主要是为了:1)便于移植,2)更为严格德类型检查。
    WORD固定是2字节,DWORD固定是4字节。而int则不是,它随着操作系统的不同,可以有不一样的字节数。如在DOS和Windows 3.x等16位操作系统下,int是2字节;在Windows 9x/2000/xp下,它是4字节(这也是为什么你说换了没事的原因了)。
    在序列化操作中,因为序列化是按照字节流存取的,为了保证不会错位,要求使用具有明确字节数目的数据类型。所以不能直接使用int,它必须经过转换才行。
      

  5.   

    标准c++没有规定int的长度,而一些操作和整数的长度有关,所以必须定义一些长度固定的整数类型,所以windows sdk就定义了DWORD、WORD、BYTE的类型。
      

  6.   

    多谢,但哪些操作和长度无关呢?我认为只要用了int都和长度有关吧,但是这句:"DWORD nLength = GetLogicalDriveStrings(sizeof(szDriverName),szDriverName);"这里不可以用int nLength吗?请指点,从C++到SDK这一点我总是不能理解 :(
      

  7.   

    多谢,但哪些操作和长度无关呢?我认为只要用了int都和长度有关吧,但是这句:"DWORD nLength = GetLogicalDriveStrings(sizeof(szDriverName),szDriverName);"这里不可以用int nLength吗?请指点,从C++到SDK这一点我总是不能理解 :(