2015-12-10 61 views
-3

如果您將編譯並執行以下c代碼,會輸出什麼內容?這個程序將如何組織內存?

void main() 
{ 
    int i; 
    float a=5.2; 
    char *ptr; 
    ptr=(char *)&a; 

    for(i=0;i<=3;i++) 
     printf("%d ",*ptr++); 
} 

任何人都可以回答和辯解嗎?

+1

你爲什麼不嘗試編譯和執行呢? – Kotshi

+2

它會像'error:'main'必須返回'int',後面跟着'command not found'。 – juanchopanza

+0

@juanchopanza不一定,默認'gcc'會接受它,雖然我不建議這樣做... – Kotshi

回答

1
ptr=(char *)&a; 

您正在將float變量的地址轉換爲字符指針。

接下來您正在訪問該內存。

因此,您需要了解float變量的存儲方式。再看看你的系統的體系結構(小端或大端),那麼只有你可以映射其內容

看到How to represent FLOAT number in memory in C

-1

不知道它是什麼上運行,並且它是什麼就可以了編制將是很難說? 您是否知道某些系統以相反的方式存儲構成較長類型的字節,int或float的大小將是不同的字節數,並且編譯器可能會將參數放在堆棧中,或者對其重新排序。 ...

所以你(想像)最終可能會以一個兩個字節浮點(好吧,並不可怕現實,但有可能),在內存佈局旁邊int是:

Float a [Low byte] 
Float a [High byte] 
Int i [Low byte] 
Int i [High byte] 
char * ptr [Low byte] 
char * ptr ... etc 

和你4字節值的迭代將直接通過兩個堆棧變量......

更有趣的是,如果comp iler制定出來你已經上市的方式,但再有(傻)兩個字節浮點(忽略字節順序):

Int i [Low byte] 
Int i [High byte] 
Float a [Low byte] 
Float a [High byte] 
char * ptr [Low byte] 
char * ptr ... etc 

你的四次字節迭代將開始檢查是檢查指針的內容(本身)。

因此,在循環檢查數據時,你可能需要使用你正在研究類型的大小:

for (i=0; i<= sizeof(a); i++) 
0

我猜你是想了解如何IEE754作品。

下面的代碼可以告訴你浮動是如何表示的:

#include <stdio.h> 
#include <math.h> 

typedef union { 
    float f; 
    struct { 
    unsigned int mantissa : 23; 
    unsigned int exponent : 8; 
    unsigned int sign : 1; 
    } parts; 
} myStruct; 

int main() 
{ 
    myStruct a; 

    a.f=5.2; 
    float Calculated; 

    unsigned int Temp = a.parts.mantissa; 
    double significand = 1; 

    // LSB will be 1/(2^24) 
    double bitValue = (double)(1)/(double)(16777216); 

    // Calculate the significand value 
    do 
    { 
     bitValue *= 2; 
     significand += ((Temp&0x00000001) == 1) ? bitValue : 0; 

    }while (Temp>>=1); 

    printf("Hex Value = %04x\n",*((unsigned int *)&a.f)); 
    printf("Float Value = %f\n",a.f); 
    printf("exp   = %i, 0x%02x\n",a.parts.exponent, (unsigned int)(a.parts.exponent)); 
    printf("sign  = %i\n",a.parts.sign); 
    printf("mantissa = %i, 0x%02x\n",a.parts.mantissa,(unsigned int)(a.parts.mantissa)); 
    printf("significand = %1.10f\n\n", significand); 


    Calculated = pow(-1, a.parts.sign) * pow(2,a.parts.exponent-127) * significand; 
    printf ("Calculated: %f\n", Calculated); 

    return 0; 
} 

用命令編譯:

gcc -o float_IEEE754 float_IEEE754.c -lm -Wall