簡體   English   中英

指針未在c中給出預期的輸出

[英]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的內部位模式,則可以執行此操作-但代碼將取決於實現。 以下內容適用於幾乎所有使用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位IEEE格式(又名double

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM