1

我的c代码有点麻烦。我正在尝试提取符号、指数和尾数。到目前为止,它适用于符号和指数。问题从尾数开始。例如,我们以-5.0为例。符号1位,指数8位,尾数23位。这是-5.0的二进制表示法:

1 10000001 01000000000000000000000

1 = 符号

10000001 = 指数

01000000000000000000000 =尾数。

我想把尾数的部分还回去。

static int fpmanitssa(uint32_t number) {

   uint32_t numbTemp = 8388607;
   number = number & numbTemp;  //bitwise AND, number should be 2097152.

   int numbDiv;
   int leftover;
   char resultString[23];
   size_t idx = 0;

   do {
       numbDiv = number/2;
       leftover = number % 2;
       resultString[idx++] = leftover;
       number = numbDiv;
   } while (number != 0);

 return resultString;

我得到的结果是负数。我不知道为什么它不起作用。你能帮忙找出问题吗?

关于萩

4

3 回答 3

1

1) 浮点数有有效数字(带有线性刻度,也称为小数部分),而不是尾数(带有对数刻度)。

2)您的函数被声明为返回一个int,但您尝试返回resultString,它是一个 的数组char。数组char不是int并且不能自动转换为int

3)如果你确实 return resultString,它会失败,因为生命周期resultString只是函数执行期间的时间;函数返回后不能使用。如果您确实打算从函数返回字符,则应声明它,以便调用者传入一个合适大小的现有数组,或者函数动态分配一个数组(如malloc)并将其地址返回给负责的调用者最终释放它(用free)。

4)如果你想返回一个int带有编码有效位的位,并且number在低位包含编码的浮点数和编码的有效位,那么你所要做的就是用 AND 操作删除高位并返回低位。

5) 如果 char 数组是要形成一个可打印的数字而不是数字位,'0'则应在每个位上相加,将其从整数 0 或 1 转换为字符“0”或“1”。在这种情况下,您可能还希望在resultString.

6) 位resultString按从低位到高位的顺序分配,如果resultString打算稍后打印,这可能与期望的顺序相反。resultString(如果只用于计算而不用于打印,订单可能会很好。)

7)以上假设您只想返回编码的有效位,即浮点编码中的显式位。如果要返回表示的有效位,包括隐式位,则需要第 24,如果指数非零,则为 1,否则为 0。(当然,假设这个数字不是 NaN 或无穷大。)

于 2013-05-17T17:16:57.683 回答
0

如果你碰巧在 uClibc 或 glibc 上,你可以使用ieee754.hmantissa字段,像这样

#include <ieee754.h>

static unsigned int fpmanitssa(float number)
{
        ieee754_float x = {.f = number};
        return x.mantissa;
}
于 2013-05-17T17:27:40.413 回答
0

一方面,您的函数声明指定您返回一个 int,但随后您返回 resultString,它是一个 char*。我认为您可能依赖于不属于 C 的自动类型转换。要使 resultString 看起来像您想要的那样,您需要将 0x30 添加到剩余部分(0x30 是“0”,0x31 是“1”)。

然后你需要空终止字符串并使用 atoi() 将其转换回 int。

以下内容可能无法完全按照您的预期工作,但包括处理 ascii/整数转换的更改:

static int fpmanitssa(uint32_t number) {

   uint32_t numbTemp = 8388607;
   number = number & numbTemp;  //bitwise AND, number should be 2097152.

   int numbDiv;
   int leftover;
   char resultString[24] = {0};
   size_t idx = 0;

   do {
       numbDiv = number/2;
       leftover = number % 2;
       resultString[idx++] = leftover + 0x30;
       number = numbDiv;
   } while (number != 0);

 return atoi(resultString);
}
于 2013-05-17T17:19:11.420 回答