在32的CPU上,为什么Windows定义的WORD是两个字节,DWORD是四个字节呢?

时间:2022-09-02 22:46:18
我记得上课的时候老师讲过,在32位的计算机上字长就应该是32,表示了一个字的大小,那么一个字就应该是4个字节。可我看MSDN里定义的WORD是两个字节,而DWORD是四个字节,要按上面那样分析,在现在的32位操作系统上(Windows XP),WORD应该定义为四个字节,DWORD应该定义为8个字节才对啊!

有人知道这是为什么吗?

9 个解决方案

#1


因为是这个样子的

typedef unsigned short      WORD;
typedef unsigned long       DWORD;

不要说是32的U是这样,64也是这样

#2


这个不能一概而论,要看你在什么环境下!!

不同的编译环境有可能是不同的!

#3


就是为了避免不同的机器有不同的长度,才使用了这样的定义。这是从16位计算机时代遗留下来的,当时一个字长(WORD)就是16位,所以使用short来作为WORD。

#4


机器字长的概念与WORD的定义无关

#5


WORD = 2 BYTES
BYTE = 8 BITS
->16 BITS

#6


这个是编程语言的标准定义啊。一个字节就是8位。一个字就是两个字节,也就是16位。DWORD当然就是4个字节32位。这个与设备环境和编程的具体语言无关。

为了适应32位机器的需要。在windows操作系统中,以32位为例。它为了加快数据处理速度,有了数据对齐的概念。比如说,你定义了一个结构
struct MyChars
{
char a;
char b;
}
本来char变量只有一个字节,但你考察sizeof(MyChars)就会发现是4。这就是数据对齐。对于不足32位的数据来说,windows会给它分配32位的空间,来提高处理速度。但附加的两位是不需要处理的。



#7



呵呵,依我看,这是一个历史遗留问题。

因为,在16位机的时候,WORD 为2个字节的,这个是没有问题的;

等发展到32位机的时候,为了兼容以前的程序移植,所以 WORD 还保留为2个字节,而定义 DWORD 为正常的4个字节。

都是兼容惹得祸,但是,不兼容又不行!

#8


非常感谢大家!我发现主要是两种观点:

一种是Windows最初设计时还使用的是16位CPU,所以将WORD设计为两个字节,DWORD设计为四个字节,后来为了移植和兼容的考虑将这个继承了下来,到32位CPU上也没有做改变。

另一种是这个WORD和DWORD的定义,和我们所学的字,双字根本就不是一回事儿。只是微软为两个字节和四个字节的数据类型做定义的一个名字。

不知道哪种观点是正确的。。。

#9


WORD和DWORD确实只是微软定义的两个类型。它是我们所学过的字和双字的实现。

但你只要看一下宏的定义就会知道,
typedef unsigned short WORD;
typedef unsigned long DWORD;

unsigned short和unsigned long是根据C标准定义的。这个与系统是32位,还是16位无关。与是否使用的是微软的编译器也无关。


但在实际的处理中,不同的硬件系统下要考虑数据对齐问题。
前面我有数据对齐的介绍。建议你从网上查一下相关资料,会有更多的了解。

#1


因为是这个样子的

typedef unsigned short      WORD;
typedef unsigned long       DWORD;

不要说是32的U是这样,64也是这样

#2


这个不能一概而论,要看你在什么环境下!!

不同的编译环境有可能是不同的!

#3


就是为了避免不同的机器有不同的长度,才使用了这样的定义。这是从16位计算机时代遗留下来的,当时一个字长(WORD)就是16位,所以使用short来作为WORD。

#4


机器字长的概念与WORD的定义无关

#5


WORD = 2 BYTES
BYTE = 8 BITS
->16 BITS

#6


这个是编程语言的标准定义啊。一个字节就是8位。一个字就是两个字节,也就是16位。DWORD当然就是4个字节32位。这个与设备环境和编程的具体语言无关。

为了适应32位机器的需要。在windows操作系统中,以32位为例。它为了加快数据处理速度,有了数据对齐的概念。比如说,你定义了一个结构
struct MyChars
{
char a;
char b;
}
本来char变量只有一个字节,但你考察sizeof(MyChars)就会发现是4。这就是数据对齐。对于不足32位的数据来说,windows会给它分配32位的空间,来提高处理速度。但附加的两位是不需要处理的。



#7



呵呵,依我看,这是一个历史遗留问题。

因为,在16位机的时候,WORD 为2个字节的,这个是没有问题的;

等发展到32位机的时候,为了兼容以前的程序移植,所以 WORD 还保留为2个字节,而定义 DWORD 为正常的4个字节。

都是兼容惹得祸,但是,不兼容又不行!

#8


非常感谢大家!我发现主要是两种观点:

一种是Windows最初设计时还使用的是16位CPU,所以将WORD设计为两个字节,DWORD设计为四个字节,后来为了移植和兼容的考虑将这个继承了下来,到32位CPU上也没有做改变。

另一种是这个WORD和DWORD的定义,和我们所学的字,双字根本就不是一回事儿。只是微软为两个字节和四个字节的数据类型做定义的一个名字。

不知道哪种观点是正确的。。。

#9


WORD和DWORD确实只是微软定义的两个类型。它是我们所学过的字和双字的实现。

但你只要看一下宏的定义就会知道,
typedef unsigned short WORD;
typedef unsigned long DWORD;

unsigned short和unsigned long是根据C标准定义的。这个与系统是32位,还是16位无关。与是否使用的是微软的编译器也无关。


但在实际的处理中,不同的硬件系统下要考虑数据对齐问题。
前面我有数据对齐的介绍。建议你从网上查一下相关资料,会有更多的了解。