C

时间:2016-01-17 07:17:35

标签: c binary floating-point decimal

我正在尝试编写C程序,将float类型的变量初始化为1000.565300,并提取IEEE 754表示的相关字段。我应该提取符号位(位31),指数字段(位30到23)和有效字段(位22到0)。我应该使用bit masking和shift操作来提取这些字段。我的程序应将提取的字段保留在32-bit unsigned integers中,并应以hexadecimalbinary格式打印其值。这是我的计划。我不知道如何bit masking

1 个答案:

答案 0 :(得分:0)

嗯,一个简单的方法就是:

将浮点位解释为无符号:uint32_t num = *(uint32_t*)&value

这意味着:我想将值的地址视为32位无符号的地址,然后我想取存储在该地址的值

签署:int sign = (~(~0u>>1)&num) ? -1 : 1 //checks if first bit of float is 1 or 0 , if it's 1 then it's a negative number

exp part:uint32_t exp = num&0x7F800000

尾数:uint32_t mant = num&0x007FFFFF

如果你不了解面具:

0x7F8000000 11111111 00000000000000000000000

0x007FFFFF0 00000000 11111111111111111111111

对于打印位,您可以使用此功能:

void printbits(uint32_t num)
{
    for(uint32_t m=~(~0u>>1);m;m>>=1)  // initial m = 100..0 then 0100..0 and so on
      putchar(n&m ? '1' : '0'); 
    putchar('\n');
}