为什么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));
}
答案 0 :(得分: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/