所以我得到了一个任务,我必须从uint32_t给出的浮点数中提取符号,指数和尾数。我必须在C中这样做,正如您所料,我该怎么做?
对于标志,我会搜索MSB(最高有效位,因为它告诉我我的数字是正数还是负数,取决于它是0还是1)
或者让我们直接了解我的想法,我可以将我的32位数字“拼接”成三部分吗?
获取msb / sign的1位 之后是1个字节,代表指数 最后23位为尾数
它可能不会那样,但你可以给我一个提示/解决方案吗? 我知道freexp,但我想要一个替代方案,在那里我学到更多的C. 谢谢。
答案 0 :(得分:2)
如果您知道浮点类型的按位布局(例如,因为您的实现支持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
),这都可以正常工作。