如何从 32 位浮点数中提取符号、尾数和指数

How to extract the sign, mantissa and exponent from a 32-Bit float

所以我接到了一个任务,我必须从给定的浮点数 uint32_t 中提取符号、指数和尾数。我必须在 C 中执行此操作,如您所料,我该怎么做?

对于符号,我会搜索 MSB(最高有效位,因为它告诉我我的数字是正数还是负数,具体取决于它是 0 还是 1)

或者让我们直接进入我的想法,我可以 "splice" 我的 32 位数分成三部分吗?

获得 msb/sign 的第 1 位 然后是1个字节代表指数 尾数的最后 23 位

它可能不会那样工作,但你能给我一个 hint/solution 吗? 我知道 freexp,但我想要一个替代方案,在那里我可以学到更多的 C。 谢谢。

如果您知道浮点类型的按位布局(例如,因为您的实现支持 IEEE 浮点表示),则将指针转换为您的浮点变量(floatdouble 类型) , 或 long double) 转换为指向 unsigned char 的指针。从那里,将变量视为 unsigned char 的数组,并使用按位运算提取所需的部分。

否则,执行此操作;

  #include <math.h>

  int main()
  {
       double x = 4.25E12;   /* value picked at random */

       double significand;
       int exponent;
       int sign;

       sign = (x >= 0) ? 1 : -1;    /*  deem 0 to be positive sign */
       significand = frexp(x, &exponent);
  }

上面sign的计算应该很明显了

significand可能是正数也可能是负数,对于非零xsignificand 的绝对值在 [0.5,1) 范围内,乘以 2exponent 次方得到原始值。

如果 x0exponentsignificand 都将是 0

无论您的编译器支持何种浮点表示(假设 double 值),这都将起作用。