Почему в С++ мы используем 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 бит на всей платформе.