所以我接到了一个任务,我必须从给定为 uint32_t 的 float 中提取符号、指数和尾数。我必须在 C 中执行此操作,如您所料,我该怎么做?
对于符号,我会搜索 MSB(最高有效位,因为它告诉我我的数字是正数还是负数,具体取决于它是 0 还是 1)
或者让我们直接进入我的想法,我可以将我的 32 位数字“拼接”成三部分吗?
获取 msb/sign 的 1 位
然后是1个字节代表指数
尾数的最后 23 位
它可能不会那样工作,但你能给我一个提示/解决方案吗?
我知道 freexp,但我想要一个替代方案,在那里我可以学到更多的 C。
谢谢。
如果您知道浮点类型的按位布局(例如,因为您的实现支持 IEEE 浮点表示),则将指针转换为您的浮点变量(类型为 float
、double
或 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
对于非零 x
可以是正数或负数。 significand
的绝对值在 [0.5,1)
范围内,乘以 2
的 exponent< 次方
给出原始值。
如果x
为0
,则exponent
和significand
都将为0
.
无论您的编译器支持何种浮点表示形式(假设 double
值),这都将起作用。