2015-12-10 4 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. а затем увидеть архитектуру вашей системы (Little Endian или большой Endian), то только вы можете отобразить его содержимое

см How to represent FLOAT number in memory in C

-1

Не зная, что он работает на, и что он был составлен на нем будет трудно сказать? Знаете ли вы, что некоторые системы хранят байты, которые составляют более длинные типы, наоборот, что размер int или float будет отличаться от числа байтов и что компиляторы могут помещать параметры в стек или переупорядочивать их. ...

Таким образом, вы (предположительно) может в конечном итоге с двумя байт поплавка (ок, не страшно реалистично, но возможно), что изложенные в памяти рядом с ИНТ:

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 Илер положил его так, как вы перечислили, но опять же, что (глупо) два байт поплавка (игнорировать порядок байт):

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 
Смежные вопросы