64 бита могут представлять до 2 ^ 64 различных значений , но (1) C не обещает использовать все 64 бита и (2) в типе с плавающей запятой, а не все различные значения представляют целые числа.
Числа с плавающей запятой должны использовать некоторые свои биты для представления знака и показателя степени. Для большинства платформ в наши дни 64-битный double
будет иметь 1 бит для знака, 11 для показателя степени и 52 + 1 для значимого. (+1 является наиболее значимым битом 1. Он на самом деле не присутствует; он подразумевается значением показателя степени, и предполагается, что он равен нулю только для показателей, значения которых представляют собой нули и денормалы.)
Конечным результатом разработки является то, что любое целое число от -2 ^ 53 до 2 ^ 53 будет соответствовать ... как и любое из этих целых чисел, умноженное на достаточно малую степень двух, если вы можете принять несколько огромных предостережений. (Подвох в том, что целые числа более 2 ^ 53 забывают все, кроме самых значимых 53 битов, поэтому, например, вы не можете добавить 1 к ним, чтобы получить следующее целое число.)
Что касается вашего printf
, поскольку строка формата представляет другой тип, чем вы фактически передаете, вы сталкиваетесь с неопределенным поведением. Но один из возможных результатов заключается в том, что вы увидите десятичную версию значения битов int, представляющего ваш тип double, который, как правило, сильно отличается от того, что представляет ваш тип double.