[英]Pointer not giving expected output in c
為什么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位IEEE格式(又名double
)
您可以在以下位置找到有關printf
格式的更多信息: http : //www.cplusplus.com/reference/cstdio/printf/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.