вопрос про reinterpret_cast - PullRequest
2 голосов
/ 29 июля 2010

у меня следующий код

#include <iostream>
using namespace std;
int main(){

    int i;
     char *p="this is a string";
     i=reinterpret_cast<int>(p);
     cout<<i<<"\n":



     return 0;
}

вывод: 7648 пожалуйста, объясните reinterpret_cast

Ответы [ 4 ]

4 голосов
/ 29 июля 2010

reinterpret_cast заставляет данные, которые вы преобразуете, рассматриваться как другой тип без какого-либо преобразования. Согласно стандарту, единственное, что определяет поведение после reinterpret_cast, - это reinterpret_cast его возврат к исходному типу.

Это звучит немного бесполезно, но одна из причин, по которой вам может понадобиться это, например, использование определенных библиотек C (например, pthreads) в C ++. Многие библиотеки C, которые используют обратные вызовы, передают в функцию обратного вызова параметр типа void*. В C ++ правильный способ справиться с этим - взять указатель на то, что вы хотите использовать в качестве параметра, reinterpret_cast на void* при передаче его в библиотеку C, а затем reinterpret_cast на любое другое это на самом деле внутри обратного вызова.

Хотя не гарантируется, что стандарт определит поведение , на большинстве платформ / компиляторов reinterpret_cast просто рассматривает данные как разные типы, используя один и тот же битовый шаблон , Например, если у вас есть 32-разрядное двойное число d, битовая комбинация которого равна 01101010 00111100 01101010 01000001, и вы пишете int i = reinterpret_cast<int>(d), тогда i будет целым числом, битовая комбинация которого 01101010 00111100 01101010 01000001, даже если это будет представляет сильно отличающееся числовое значение в виде целого числа от двойного. И, очевидно, это может быстро привести к неприятностям, если задействованные типы имеют разный размер.

2 голосов
/ 29 июля 2010

См. здесь .

Что именно неясно? Пожалуйста, будьте конкретны. Также ищите, прежде чем спрашивать, есть много вопросов об этом на SO.

1 голос
/ 29 июля 2010

Там не так много, чтобы объяснить. Результат reinterpret_cast зависит от платформы. То, что вы тестируете, - это либо адрес строковой константы, либо то, что от нее осталось, когда она приведена в int

1 голос
/ 29 июля 2010

reinterpret_cast<> здесь будет конвертироваться без проверки указателя p на int, но вы не можете делать никаких предположений о том, что будет представлять это int. Единственное, что вы можете сделать, это преобразовать этот указатель обратно в прежнее состояние.

На более практическом замечании вполне вероятно, что ваш компилятор поместит адрес, на который указывает p, в значение int, но размер int может не соответствовать размеру системного указателя, поэтому вам, вероятно, следует использовать что-то например uintptr_t вместо int.

Вы можете использовать что-то вроде Boost lexical_cast<>, которое будет пытаться преобразовать строковое представление целого числа в действительное целочисленное значение, но я не уверен, что ваша цель была здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...