Почему в С++ мы используем DWORD, а не unsigned int?

Я не боюсь признаться, что я немного новичок в С++, так что это может показаться глупым вопросом, но....

Я вижу, что DWORD используется повсюду в примерах кода. Когда я смотрю, что на самом деле означает DWORD, его, по-видимому, просто беззнаковый int (от 0 до 4 294 967 295). Итак, тогда мой вопрос: почему у нас есть DWORD? Что это дает нам, что интегральный тип "unsigned int" нет? Связано ли это с переносимостью и различиями в машинах?

Ответ 1

DWORD не является типом С++, определенным в <windows.h>.

Причина в том, что DWORD имеет определенный диапазон и формат функций Windows, поэтому, если вам требуется, чтобы этот диапазон использовал этот тип. (Или, как они говорят: "Когда в Риме делайте, как делают римляне".) Для вас это соответствует unsigned int, но это может быть не всегда так. Чтобы быть в безопасности, используйте DWORD, когда ожидается DWORD, независимо от того, что это может быть на самом деле.

Например, если они когда-либо изменяли диапазон или формат unsigned int, они могли бы использовать другой тип для подделки DWORD, чтобы сохранить те же требования, и весь код с использованием DWORD был бы не самым лучшим. (Точно так же они могли бы решить, что DWORD должен быть unsigned long long, изменить его, и весь код с использованием DWORD будет не самым лучшим.)


Также обратите внимание, что unsigned int не обязательно имеет диапазон от 0 до 4 294 967 295. См. здесь.

Ответ 2

Когда MS-DOS и Windows 3.1 работали в 16-разрядном режиме, слово Intel 8086 составляло 16 бит, Microsoft WORD составляло 16 бит, Microsoft DWORD - 32 бита, а типичный компилятор unsigned int - 16 бит.

Когда Windows NT работала в 32-битном режиме, слово Intel 80386 составляло 32 бита, Microsoft WORD составляло 16 бит, Microsoft DWORD - 32 бита, а типичный неподписанный компилятор int составлял 32 бита. Имена WORD и DWORD уже не были самоописательными, но они сохранили функциональность программ Microsoft.

Когда Windows работает в 64-битном режиме, слово Intel составляет 64 бита, Microsoft WORD - 16 бит, Microsoft DWORD - 32 бита, а типичный компилятор unsigned int - 32 бита. Имена WORD и DWORD больше не являются самоописательными, а unsigned int больше не соответствует принципу наименьших неожиданностей, но они сохраняют функциональность множества программ.

Я не думаю, что WORD или DWORD будут когда-либо изменяться.

Ответ 3

Разработчики SDK предпочитают определять свои собственные типы с помощью typedef. Это позволяет изменять базовые типы только в одном месте без изменения всего кода клиента. Важно следовать этому соглашению. DWORD вряд ли будет изменен, но типы, подобные DWORD_PTR, различны на разных платформах, таких как Win32 и x64. Итак, если какая-либо функция имеет параметр DWORD, используйте DWORD, а не unsigned int, и ваш код будет скомпилирован во всех будущих версиях заголовков Windows.

Ответ 4

Для себя, я бы предположил, что unsigned int является специфичным для платформы. Целое число может быть 8 бит, 16 бит, 32 бита или даже 64 бита.

DWORD, с другой стороны, указывает свой собственный размер, который является Double Word. Word - 16 бит, поэтому DWORD будет известен как 32 бит на всей платформе.