如果要编译并执行以下c代码,将输出什么?
void main()
{
int i;
float a=5.2;
char *ptr;
ptr=(char *)&a;
for(i=0;i<=3;i++)
printf("%d ",*ptr++);
}
任何人都可以回答并证明其合理性吗?
答案 0 :(得分:1)
ptr=(char *)&a;
您将float变量的地址类型转换为字符指针。
然后你正在访问那个记忆。
所以在这里你需要了解如何存储float变量。然后看看你的系统架构(Little endian或big endian)然后只有你可以映射它的内容
答案 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++)