Добро пожаловать в переполнение стека.Не очень понятно, что вы пытаетесь сделать с этим кодом, но в первую очередь я скажу, что он делает именно то, что говорит.Он пытается отформатировать данные с неверной строкой формата.В результате получается мусор, но это не обязательно означает, что он будет выглядеть как мусор.
Если часть идеи состоит в том, чтобы распечатать внутренний битовый шаблон double
в шестнадцатеричном формате, вы можете сделать это - но код будет зависеть от реализации.Следующее должно работать практически на любой современной 32- или 64-битной настольной реализации, использующей 64-битные типы double
и long long int
:
double d = 3.141592653589793238;
printf("d = %g = 0x%016llX\n", d, *(long long*)&d);
Спецификация %g
- это быстрый способраспечатайте double
в (обычно) легко читаемой форме.Формат %llX
печатает unsigned long long int
в шестнадцатеричном формате.Порядок байтов зависит от реализации;даже если вы знаете, что double
и long long int
имеют одинаковое количество битов.На компьютере Mac, ПК или другом компьютере с архитектурой Intel / AMD вы получите отображение в порядке старшего разряда.
Выражение *(long long *)&d
(чтение справа налево) займетадрес d
, преобразовать этот указатель double*
в указатель long long *
, а затем разыменовать этот указатель, чтобы получить значение long long
для форматирования.
Почти каждая реализация использует формат IEEE 754 для аппаратной плавающей запятойэтот век. 64-битный формат IEEE (он же double
)
Подробнее о printf
форматировании можно узнать по адресу: http://www.cplusplus.com/reference/cstdio/printf/