C++ 为什么DWORD值通常用十六进制表示?

C++ 为什么DWORD值通常用十六进制表示?,c++,windows,visual-c++,hex,dword,C++,Windows,Visual C++,Hex,Dword,我试图理解为什么DWORD值经常在MSDN上用十六进制来描述 我之所以分析这一点,是因为我试图从根本上理解为什么存在所有这些不同的数字数据类型。一位当地的导师向我暗示,DWORD和其他微软产品的诞生与处理器的发展有关。这为我理解这些数据类型提供了意义和背景。我想了解更多的背景和背景 无论哪种方式,我都可以使用一些解释或参考资料来了解如何记住DWORD、无符号整数、字节、位、字等之间的差异 总之,我的问题是: 1) 为什么DWORDs用十六进制表示? 2) 您能提供有关数字数据类型之间的差异以及创

我试图理解为什么DWORD值经常在MSDN上用十六进制来描述

我之所以分析这一点,是因为我试图从根本上理解为什么存在所有这些不同的数字数据类型。一位当地的导师向我暗示,DWORD和其他微软产品的诞生与处理器的发展有关。这为我理解这些数据类型提供了意义和背景。我想了解更多的背景和背景

无论哪种方式,我都可以使用一些解释或参考资料来了解如何记住DWORD、无符号整数、字节、位、字等之间的差异

总之,我的问题是: 1) 为什么DWORDs用十六进制表示?
2) 您能提供有关数字数据类型之间的差异以及创建它们的原因的资源吗?

当DWORD常量用作可以按位方式组合在一起的标志时,它们通常以十六进制形式写入。这使我们更容易看出这一点。这就是为什么您会看到0x01、0x02、0x04、0x08、0x10、0x20等。程序员只会将这些值识别为只有一个位集的二进制表示


当它是一个枚举时,您会看到0x01、0x02、0x03等等。它们通常仍然是用十六进制编写的,因为程序员往往会养成这些习惯

计算机中的一切都是由0和1组成的。但是用二进制编写整个DWORD是相当乏味的:

00000000 11111111 00000000 11111111
为了节省空间和提高可读性,我们喜欢用较短的形式编写。十进制是我们最熟悉的,但不能很好地映射到二进制。八进制和十六进制映射非常方便,完全与二进制位对齐:

// each octal digit is exactly 3 binary digits
01 010 100 binary  =  124 octal

// each hexadecimal digit is exactly 4 binary digits
0101 0100 binary   =  54 hexadecimal
由于十六进制与8位字节(2个十六进制数字构成一个字节)非常吻合,所以符号一直存在,这是使用最多的。它更容易阅读,更容易理解,在使用位掩码时更容易排队

用于识别正在使用哪个基的常规速记:

  1234543 = decimal
 01234543 = octal (leading zero)
0x1234543 = hexadecimal (starts with 0x)
至于你关于字节、单词、DWORD等的问题

计算机是从一开始的。只有1或0。他在原作中有一个客串

字节有8位长(好吧,从前有7位字节,但我们可以忽略它们)。这允许您拥有0-255之间的数字,或-128到127之间的有符号数字。比1/0更好,但仍然有限。你可能听说过“8位游戏”。这就是我们所指的。该系统是围绕字节构建的

然后计算机发展到拥有16位寄存器。这是2个字节,被称为单词(不,我不知道为什么)。现在,数字可能是0-65535或-32768到32767

我们继续需要更多的电力,计算机被扩展到32位寄存器。4字节,2个字,也称为双字(双字)。到目前为止,您可以在“C:\Windows”中查看“system”(旧的16位部件)和“system32”(新的32位组件)的目录

然后出现了QWORD(四字)。4个字,8个字节,64位。听说过任天堂64吗?这就是这个名字的由来。现代建筑现在在这里。cpu的内部包含64位寄存器。您通常可以在这样的CPU上运行32位或64位操作系统

包括位、字节、字、双字。这些是原始类型,通常用于标志、位掩码等。如果要保留实际数字,最好使用有符号/无符号整数、长等


我没有提到浮点数,但希望这有助于理解基本概念。

为了详细说明Tim的答案,这是因为将十六进制转换为二进制并返回非常容易-每个十六进制数字是4个二进制数字:

0x1 = 0001
0x2 = 0010
...
0xD = 1101
0xE = 1110
0xF = 1111

因此,
0x2D
=
0010 1101

为了记录,16位无符号数据被命名为WORD beas,因为当时计算机有16位寄存器

在计算机历史中,8位数据,其中可以存储在寄存器中的最大数据。由于它可以存储ascii字符,所以通常称为字符

但16位计算机出现了,CHAR不适合命名16位数据。 所以16位数据通常被称为字,因为它是一个寄存器中可以存储的最大数据单位,这是一个很好的类比,可以继续为CHAR创建的数据单位

因此,在某些计算机上,使用不同的CPU字通常指寄存器的大小。在Saturn CPU上,使用64位寄存器,一个字是64位的

当32位x86处理器问世时,出于兼容性原因,WORD保留了16位,创建DWORD是为了将其扩展到32位。QWORD和64位也是如此


至于为什么十六进制常用来描述一个词,这与一个词的定义的性质有关,这个定义与它的语域来源有关。在汇编程序编程中,您使用十六进制来描述数据,因为处理器只知道二进制整数(0和1)。十六进制是使用二进制的一种更简洁的方法,它仍然保留二进制的一些属性。

您有一个非常有趣和棘手的问题

简言之,有两个驱动因素导致了竞争型家族的存在——基于DWORD和基于int:

1) 希望一方面有交叉形状,另一方面有严格的尺寸类型

2) 人民的保守主义

无论如何,为了给你们的问题提供充分详细的答案,以及这个领域足够好的背景,我们必须深入研究计算机的历史。从计算的早期开始我们的故事

首先,有一个机器字的概念。机器字是一个大小严格的二进制数据块,在特定处理器中自然处理。所以,机器字的大小几乎不依赖于处理器,通常等于一般内部处理器寄存器的大小。通常,它可以细分为两个相等的部分,处理器也可以作为独立的数据通道访问这两个部分。例如,在x86处理器上,mac
byte    =   8 bit
word    =  16 bit
dword   =  32 bit
qword   =  64 bit
dqword  = 128 bit
"The fundamental storage unit in the C++ memory model is the byte. A byte is at 
least large enough to contain any member of the basic execution character set and 
is composed of a contiguous sequence of bits, the number of which is implementa-
tion-defined. The least significant bit is called the low-order bit; the most 
significant bit is called the high-order bit. The memory available to a C++ program
consists of one or more sequences of contiguous bytes. Every byte has a unique 
address."
"There are five signed integer types: “signed char”, “short int”, “int”, and 
“long int”., and “long long int”. In this list, each type provides at least as 
much storage as those preceding it in the list. Plain ints have the natural size
suggested by the architecture of the execution environment; the other signed 
integer types are provided to meet special needs."
1100010001011001
50265
0x00000100
0x100
10010001101000101011001111000
0x1234568
00000000100000000000000000000
0x00100000
0x00 0x10 0x00 0x00
   3    2    1    0
0 - 0000  4 - 0100  8 - 1000  C - 1100
1 - 0001  5 - 0101  9 - 1001  D - 1101
2 - 0010  6 - 0110  A - 1010  E - 1110
3 - 0011  7 - 0111  B - 1011  F - 1111