为什么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));
}

最佳答案

欢迎使用堆栈溢出。尚不清楚您要使用此代码做什么,但是我要说的第一件事是它确实按照它说的去做。它尝试使用错误的格式字符串格式化数据。结果是垃圾,但这并不一定意味着它看起来像垃圾。

如果此想法的一部分是用十六进制打印double的内部位模式,则可以执行此操作-但代码将取决于实现。以下内容适用于几乎所有使用doublelong long int类型的64位的现代32或64位桌面实现:

double d = 3.141592653589793238;
printf("d = %g = 0x%016llX\n", d, *(long long*)&d);


%g规范是一种以(通常)易于阅读的形式打印double的快速方法。 %llX格式以十六进制打印unsigned long long int。字节顺序与实现有关;即使您知道doublelong long int的位数相同。在Mac,PC或其他Intel / AMD架构计算机上,您将以最高有效位数优先的顺序获得显示内容。

*(long long *)&d表达式(从右到左读取)将使用d的地址,将double*指针转换为long long *指针,然后取消对该指针的引用以获取要格式化的long long值。

本世纪,几乎每种实现都使用IEEE 754格式实现硬件浮点运算。
64-bit IEEE format (aka double)

您可以在以下位置找到有关printf格式的更多信息:
http://www.cplusplus.com/reference/cstdio/printf/

10-08 13:32
查看更多