Как переосмыслить длинную без знака (DWORD) как длинную со знаком в C ++? - PullRequest
4 голосов
/ 15 июля 2011

Я хочу переосмыслить unsigned long (фактически DWORD) как signed long. Я попробовал:

DWORD x;
long y = reinterpret_cast<signed long>(x);

Тем не менее, VC ++ 2010 intellisense сообщает мне «Недопустимое преобразование типов». Зачем? Как мне это исправить?

Ответы [ 2 ]

8 голосов
/ 15 июля 2011

попробуйте вместо этого static_cast. VC генерирует ошибку, если вы пытаетесь использовать чрезмерно разрешающую приведение (например, использование reinterpret_cast, когда будет достаточно static_cast или const_cast).

В C ++ есть 5 типов приведений, каждый из которых позволяет вам делать больше (предоставляет больше разрешений). Наименее допустимыми являются броски констант (const_cast<int>(<const int>)), которые позволяют изменять модификатор констант. Существуют статические приведения (static_cast<int>)(<short>)), которые позволяют выполнять безопасные приведения типов (например, приведение к производному). Существуют динамические приведения (dynamic_cast<derived_type>(base_type), которые позволяют приводить из одного типа в другой , если существует законное преобразование между двумя (и которые возвращают ноль, если нет преобразования). Наконец, есть преобразования, которые позволяют преобразование между несвязанными типами - reinterpret_cast reinterpret_cast<int>(<void *>) и приведение в стиле C (int)<void *>.

У меня нет хорошего способа описания этих различных типов приведения, поэтому я описываю их как «более разрешающие», потому что каждый из них позволяет вам делать больше.

VC предупреждает вас, если вы используете переосмысление приведения, когда один из других типов приведения будет более подходящим для достижения вашей цели. Приведения в стиле C не имеют аналогичного предупреждения для обратной совместимости.

8 голосов
/ 15 июля 2011

Вам не нужно reinterpret_cast для преобразования неподписанного типа в подписанный, static_cast подойдет.

...