我的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;
我得到的结果是负数。我不知道为什么它不起作用。你能帮忙找到问题吗?
问候 萩
答案 0 :(得分:1)
1)浮点数具有有效数(具有线性标度,也称为分数部分),而不是尾数(具有对数标度)。
2)声明您的函数返回int
,但您尝试返回resultString
,这是char
的数组。 char
数组不是int
,无法自动转换为int
。
3)如果你确实返回resultString
,它将失败,因为resultString
的生命周期只是函数执行期间的时间;函数返回后不能使用它。如果你打算从函数中返回字符,则应声明它以便调用者传入适当大小的现有数组,或者函数动态分配数组(与malloc
一样)并将其地址返回给调用者谁负责最终解除分配(用free
)。
4)如果要返回带有编码有效位的位的int
,并且number
包含编码的浮点数和低位的编码有效位数,那么你只有要做的是用AND运算去掉高位并返回低位。
5)如果char数组要形成一个可打印的数字而不是数字位,那么应该为每个数字添加'0'
,将它从整数0或1转换为字符“0”或“1”。在这种情况下,您可能还需要resultString
末尾的空字符。
6)这些位按从低位到高位的顺序分配给resultString
,如果稍后要打印resultString
,则可能与所需的顺序相反。 (如果resultString
仅用于计算而不是打印,则订单可能没有问题。)
7)以上假定您只想返回编码的有效数,这是浮点编码中的显式位。如果要返回表示的有效数,包括隐含位,则需要24 th 位置,如果指数非零则为1,否则为0。 (当然,假设这个数字不是NaN或无穷大。)
答案 1 :(得分:0)
首先,你的函数声明指定你返回一个int,但是你返回resultString,它是一个char *。我认为你可能依赖于自动类型转换而不是C的一部分。要使resultString看起来像你想要的那样,你需要向剩余部分添加0x30(0x30为'0',0x31为'1')。 / p>
然后你需要null终止字符串并使用atoi()将其转换回int。
以下内容可能与您的预期不完全相同,但包含处理ascii / integer转换的更改:
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);
}
答案 2 :(得分:0)
如果您碰巧使用uClibc或glibc,可以使用ieee754.h
和mantissa
字段,如此
#include <ieee754.h>
static unsigned int fpmanitssa(float number)
{
ieee754_float x = {.f = number};
return x.mantissa;
}