web-dev-qa-db-fra.com

Pourquoi en C ++ utilisons-nous DWORD plutôt que unsigned int?

Je n'ai pas peur d'admettre que je suis un peu un débutant en C++. Cela peut donc sembler une question idiote, mais ...

Je vois DWORD utilisé partout dans des exemples de code. Lorsque je cherche ce que DWORD signifie vraiment, il semble qu’il ne s’agisse que d’un entier non signé (0 à 4 294 967 295). Ma question est donc la suivante: pourquoi avons-nous DWORD? Qu'est-ce que cela nous donne que le type intégral 'unsigned int' ne le soit pas? Cela a-t-il quelque chose à voir avec la portabilité et les différences entre les machines?

116
Ben Lakey

DWORD n'est pas un type C++, il est défini dans <windows.h>.

La raison en est que DWORD a une plage spécifique et le format utilisé par les fonctions de Windows. Si vous avez besoin de cette plage spécifique, utilisez ce type. (Ou comme on dit "à Rome, fais comme les Romains.") Pour toi, cela correspond à unsigned int, mais ce n'est peut-être pas toujours le cas. Pour plus de sécurité, utilisez DWORD quand un DWORD est attendu, quel qu’il soit réellement.

Par exemple, s’ils ont déjà changé la plage ou le format de unsigned int ils pourraient utiliser un type différent pour sous-tendre DWORD afin de conserver les mêmes exigences, et tout le code utilisant DWORD serait illisible. (De même, ils pourraient décider que DWORD doit être unsigned long long, changez-le, et tout le code utilisant DWORD serait illisible.)


Notez également unsigned int _ pas nécessaire va de 0 à 4 294 967 295. Voir ici .

149
GManNickG

Lorsque MS-DOS et Windows 3.1 fonctionnaient en mode 16 bits, un Intel 8086 Word comportait 16 bits, un Microsoft Word 16 bits, un Microsoft DWORD 32 bits et un compilateur int classique 16 bits.

Lorsque Windows NT fonctionnait en mode 32 bits, un Intel 80386 Word en 32 bits, un Microsoft Word en 16 bits, un Microsoft DWORD en 32 bits et un int typique du compilateur en 32 bits. Les noms Word et DWORD n'étaient plus auto-descriptifs, mais ils préservaient les fonctionnalités des programmes Microsoft.

Lorsque Windows fonctionne en mode 64 bits, Intel Word est de 64 bits, Microsoft Word de 16 bits, Microsoft DWORD de 32 bits et le nombre non signé d'un compilateur est de 32 bits. Les noms Word et DWORD ne sont plus auto-descriptifs, ET un unsigned int n'est plus conforme au principe des moindres surprises, mais conserve la fonctionnalité de nombreux programmes.

Je ne pense pas que Word ou DWORD changera un jour.

89

Les développeurs de SDK préfèrent définir leurs propres types à l'aide de typedef. Cela permet de changer les types sous-jacents uniquement à un endroit, sans changer tout le code client. Il est important de suivre cette convention. Il est peu probable que DWORD soit modifié, mais les types tels que DWORD_PTR sont différents sur des plates-formes différentes, telles que Win32 et x64. Donc, si une fonction a un paramètre DWORD, utilisez DWORD et non unsigned int, et votre code sera compilé dans toutes les futures versions des en-têtes de Windows.

11
Alex F

Pour ma part, je suppose que unsigned int est spécifique à la plate-forme. Entier pourrait être 8 bits, 16 bits, 32 bits ou même 64 bits.

DWORD, d'autre part, spécifie sa propre taille, Double Word. Les mots sont en 16 bits, donc DWORD sera appelé 32 bits sur toutes les plateformes.

6
YeenFei