По моему указателю есть int, и я также ожидаю результата int. Почему это не так?
Потому что y
является двойным, а не внутренним. Теперь, если вы хотите спросить, почему y
не имеет целочисленного значения, так как это должно быть результатом преобразования int (которое должно * иметь интегральное значение), чтобы удвоить, посмотрите на вывод следующих :
std::cout << "y value is: " << std::fixed << y << '\n';
выход вы должны увидеть:
y value is: 1717986918.000000
Так, y
делает имеет целочисленное значение, вы просто выводил его с помощью научной нотации. И если вам интересно, почему y
имеет это конкретное целочисленное значение, это потому, что это значение *p
было.
std::cout << "*p is: " << *p << '\n';
*p is: 1717986918
Если вы должны были смотреть на свалку памяти x
со значением 100.1
, вы бы увидели:
66 66 66 66 66 06 59 40
И когда вы получить доступ к этому как межд, вы получаете 66 66 66 66
, который, преобразуется в десятичное, является 1717986918.
Еще одна вещь, следует отметить, что ни одно из этого не гарантируется C++. На самом деле ваша программа на самом деле не является законной, поскольку вы нарушаете правила псевдонимов при доступе к двойному x
с помощью указателя на int.Ваша программа может стать законной и получить те же результаты, но C++ не указывает представление значений с плавающей запятой, поэтому конкретное целочисленное значение может легально отличаться.
Что я должен читать, чтобы понять?
Вот статья, которая играет с представлением поплавков: http://ridiculousfish.com/blog/posts/float.html
C++ не определяет, как представлены поплавки, но в большинстве реализаций C++ используют IEEE-754, так что вы можете также смотреть на что Спецификация. Вот страница wikipedia, чтобы вы начали: https://en.wikipedia.org/wiki/IEEE_floating_point
Чтобы узнать о правилах псевдонимов C++, вы можете найти и прочитать спецификацию. строгое сглаживание описано в §3.10/10, IIRC. Здесь также много вопросов и ответов об использовании псевдонимов на SO.
Вы * сделали * получите результат int. Он просто отформатирован с использованием представления, которое подходит только для двойного. Потому что это то, что делает cout, когда вы передаете переменную типа double. И, конечно, имеет случайное значение, где-то между +/- 2 миллиардами. –
Целое число было приблизительно 1717990000 (из-за сложного представления, которое вы отметили). Затем вы преобразовали его в плавающую точку и распечатали. –
GIGO. (Для детей, это древний вычислительный термин, который обозначает Garbage In, Garbage Out) –