В 64-разрядных Windows указатели являются 64-разрядными, а int
- 32-разрядными. Вот почему вы теряете данные в старших 32-битных во время приведения. Вместо int
используйте long long
для хранения промежуточного результата.
char* hello = "hello";
unsigned long long hello_to_int = (unsigned long long)hello;
Внести аналогичные изменения для обратного преобразования. Но это не гарантирует правильной работы преобразований, поскольку double может легко представлять весь 32-битный целочисленный диапазон без потери точности, но это не так для 64-битного целого.
Кроме того, это не сработает
unsigned int converted_int = (unsigned int)hello_to_double;
Это преобразование просто усекает любые цифры после десятичной точки в представлении с плавающей запятой. Проблема существует, даже если вы измените тип данных на unsigned long long
. Вам нужно будет reinterpret_cast<unsigned long long>
, чтобы это заработало.
Даже после всего этого вы можете столкнуться с проблемами в зависимости от значения указателя. Преобразование в double
может привести к тому, что значение будет , сигнализирующее, например, NaN , в результате чего ваш код может вызвать исключение.
Простой ответ: если вы не попробуете это для развлечения, не делайте подобные преобразования.