如果您將編譯並執行以下c代碼,會輸出什麼內容?這個程序將如何組織內存?
void main()
{
int i;
float a=5.2;
char *ptr;
ptr=(char *)&a;
for(i=0;i<=3;i++)
printf("%d ",*ptr++);
}
任何人都可以回答和辯解嗎?
如果您將編譯並執行以下c代碼,會輸出什麼內容?這個程序將如何組織內存?
void main()
{
int i;
float a=5.2;
char *ptr;
ptr=(char *)&a;
for(i=0;i<=3;i++)
printf("%d ",*ptr++);
}
任何人都可以回答和辯解嗎?
ptr=(char *)&a;
您正在將float變量的地址轉換爲字符指針。
接下來您正在訪問該內存。
因此,您需要了解float變量的存儲方式。再看看你的系統的體系結構(小端或大端),那麼只有你可以映射其內容
不知道它是什麼上運行,並且它是什麼就可以了編制將是很難說? 您是否知道某些系統以相反的方式存儲構成較長類型的字節,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++)
我猜你是想了解如何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
你爲什麼不嘗試編譯和執行呢? – Kotshi
它會像'error:'main'必須返回'int',後面跟着'command not found'。 – juanchopanza
@juanchopanza不一定,默認'gcc'會接受它,雖然我不建議這樣做... – Kotshi