如何在这个程序中组织记忆?

时间:2015-12-10 08:27:26

标签: c

如果要编译并执行以下c代码,将输出什么?

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

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

任何人都可以回答并证明其合理性吗?

3 个答案:

答案 0 :(得分:1)

ptr=(char *)&a;

您将float变量的地址类型转换为字符指针。

然后你正在访问那个记忆。

所以在这里你需要了解如何存储float变量。然后看看你的系统架构(Little endian或big endian)然后只有你可以映射它的内容

请参阅How to represent FLOAT number in memory in C

答案 1 :(得分:0)

我猜您正在尝试了解IEE754的工作原理。

以下代码可以向您展示如何表示float:

#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

答案 2 :(得分:-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字节迭代&#39;值得直接通过两个堆栈变量......

更有趣的是,如果编译器按照您列出的方式进行布局,但又有(傻)两个字节浮点数(忽略字节顺序):

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++)