Указатель не дает ожидаемый результат в c - PullRequest
0 голосов
/ 25 августа 2018

Почему переменная double не отображает значение мусора?
Я знаю, что я играю с указателями, но я хотел. И что-нибудь не так с моим кодом? Он выдал несколько предупреждений из-за несовместимых назначений указателей.

#include "stdio.h"

double y= 0;    
double *dP = &y;    
int *iP = dP;    
void main()
{
    printf("%10#x %#10x %#10x %#10x \n",&y,dP,iP,iP+1);     
    printf("%#10lf %#10lf %#10lf %#10lf \n",y,*dP,*iP,*(iP+1));     
    scanf("%lf %d %d",&y,iP,iP+1);     
    printf("%10#x %#10x %#10x %#10x \n",&y,dP,iP,iP+1);     
    printf("%#10lf %#10lf %#10d %#10d \n",y,*dP,*iP,*(iP+1));
}

Output

1 Ответ

0 голосов
/ 25 августа 2018

Добро пожаловать в переполнение стека.Не очень понятно, что вы пытаетесь сделать с этим кодом, но в первую очередь я скажу, что он делает именно то, что говорит.Он пытается отформатировать данные с неверной строкой формата.В результате получается мусор, но это не обязательно означает, что он будет выглядеть как мусор.

Если часть идеи состоит в том, чтобы распечатать внутренний битовый шаблон 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...