Проблема заключается в том, что вы используете неверный спецификатор формата в printf, %d
вместо %f
. Это вызывает неопределенное поведение.
Всякий раз, когда вы вызываете неопределенное поведение, не может быть никаких детерминированных или ожидаемых результатов. Когда у вас есть неопределенное поведение, компилятор может идти вперед и делать странные предположения, такие как «этот плавающий литерал никогда не используется, поэтому нет необходимости выделять для него память». Это означает, что вы можете распечатать места памяти мусора или даже сбой вашей программы. Поэтому анализ того, почему неопределенное поведение дал определенный результат, не является значимой задачей.
Чтобы гарантировать детерминированное поведение, вы должны сделать что-то вроде этого:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
int main(void)
{
const double number = 50.2;
union
{
double d;
uint8_t u8 [sizeof(double)];
} u = { number };
printf("Binary representation of %f:\n", number);
for(size_t i=0; i<sizeof(double); i++)
{
printf("%.2" PRIx8 " ", u.u8[i]);
}
printf("\n\n");
printf("Integer (nonsense) representation of %f:\n", number);
int i;
memcpy(&i, u.u8, sizeof(int));
printf("%d", i);
return 0;
}
Выход:
Binary representation of 50.200000:
9a 99 99 99 99 19 49 40
Integer (nonsense) representation of 50.200000:
-1717986918
Это было на машине, где дважды был 8 байт и целых 4 байта/маленький endian, что означает, что вы получите 4 наименее значимых байта в качестве некоторого бессмысленного вывода (а именно, числа 9999999Ah).
Проверьте свой код –
Вам необходимо скомпилировать с помощью 'gcc -Wall -g yoursource.c -o yourprog' (все предупреждения и информацию об отладке), улучшить код, чтобы не получать никаких предупреждений, а затем запускать'./Yourprog' и отлаживать это с 'gdb./yourprog' –
Пожалуйста, не публикуйте скриншоты для вывода обычного текста. Просто скопируйте и вставьте текст в свой вопрос. – Gerhardh