为什么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
的内部位模式,则可以执行此操作-但代码将取决于实现。以下内容适用于几乎所有使用double
和long 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
。字节顺序与实现有关;即使您知道double
和long 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/