Когда вы создаете double
, инициализированный значением 4
, его 64 бита заполняются в соответствии со стандартом IEEE-754 для чисел с плавающей запятой двойной точности. Поплавок делится на три части: знак , показатель и дробь (также известный как значим , коэффициент или мантисса ). Знак является одним битом и обозначает, является ли число положительным или отрицательным. Размеры других полей зависят от размера числа. Для декодирования числа используется следующая формула:
1. Фракция & раз; 2 Экспонент - 1023
В вашем примере бит знака равен 0, поскольку число положительное, дробная часть равна 0, поскольку число инициализируется как целое число, а часть экспоненты содержит значение 1025
(2 со смещением 1023) , Результат:
1,0 & раз; 2 2
Или, как и следовало ожидать, 4
. Двоичное представление числа (разделенное на разделы) выглядит следующим образом:
0 10000000001 0000000000000000000000000000000000000000000000000000
Или, в шестнадцатеричном, 0x4010000000000000
. При передаче значения в printf
с использованием спецификатора %d
он пытается прочитать sizeof(int)
байтов из переданных ему параметров. В вашем случае sizeof(int)
- это 4
или 32 бита. Поскольку все первые (самые правые) 32 бита 64-битного числа с плавающей запятой, которые вы предоставляете, равны 0
, очевидно, что printf
выдает 0
в качестве целочисленного вывода. Если бы вы написали:
printf("%d %d", i);
Тогда вы можете получить 0 1074790400
, где второе число эквивалентно 0x40100000
. Я надеюсь, вы понимаете, почему это происходит. Другие ответы уже дали исправление: используйте спецификатор формата %f
, и printf
правильно примет ваш double
.