Вы теряете точность, это довольно очевидно.
В этом случае есть две причины, по которым вы делаете.
- Целое число имеет только 4 байта, тогда как двойное имеет 8, что означает, что вы не можете поместить весь двойной в целое число. (На самом деле это реализация определена)
- У двойного числа есть десятичные числа, у целого - нет, поэтому целое число просто не может содержать информацию о десятичных числах.
Причина, по которой ошибки строки заключаются в том, что вы пытаетесь привести указатель к целому числу, что невозможно, то, что вы хотели сделать, это j = (int)*p;
В вашем коде есть несколько плохих практик.
- с использованием пространства имен std;
Почему "использование пространства имен std;" считается плохой практикой?
https://isocpp.org/wiki/faq/coding-standards#using-namespace-std
Как использовать итератор? (пример возникновения проблем)
Путаница с указателями и ссылками в C ++ (еще один пример того, что это вызывает проблемы; использование std :: swap; также вызывает ту же самую проблему)
- броски в стиле C
Это
(type)
, в вашем случае конкретно (int)
Есть два основных приведения, которые должны использоваться в C ++: static_cast и reinterpret_cast.
(Есть еще 2 типа, const_cast и dynamic_cast, но они не имеют значения в этом случае, и const_cast почти никогда не должен использоваться)
Оба принимают параметр шаблона к результирующему типу.
В этом случае вы, вероятно, могли бы i = static_cast<int>(d);
Для второго приведения, j =, вы должны (на самом деле вы не должны разыгрывать указатели на разные типы)
j = *reinterpret_cast<int*>(p);
Конечно, приведение двойных чисел к целым не считается хорошим, но это должно исправить ошибку вашего компилятора.