我正在尝试将十进制数(329.39062)转换为二进制数(指数,mentissa)我一直有分割错误在运行gdb测试时,它向我显示了feof我已经改变了很多,但它一直显示我在同一点分割错误我哪里做错了谢谢你的帮助。

#include <stdio.h>
#include <stdlib.h>

char* valueToConvert(int value);

int main(int argc, char *argv[])
{
        FILE* input;
        FILE* output;

        input = fopen(argv[1],"r");
        output = fopen(argv[2],"w");

    float value;
    unsigned char *charValue = (unsigned char *) &value;
    int exponentValue;
    long mantissaValue;

    while(!feof(input))
    {
        fread(&charValue, sizeof(float),1, input);
        exponentValue = ((charValue[0] & 0x7F) << 1)|((charValue[1] & 0x80) >> 7);
        mantissaValue = ((charValue[1] & 0x7F) << 8)|((charValue[2] & 0xFF) <<8) | (charValue[3] & 0xFF);
        fprintf(output,"%d %s %s\n",(charValue[0] & 0x80 >> 7),valueToConvert(exponentValue - 127),valueToConvert(mantissaValue));
    }
}

char* valueToConvert(int value)
{
    int counter = 0;
    char* conversion = calloc(32,sizeof(int));
    while(value>0)
    {
        if((value%2 == 1) && (value%2 != 0))
        {
            conversion[31 - counter++] = '1';
        }
        if((value%2 == 0) && (value%2 != 1))
        {
            conversion[31 - counter++] = '0';
        }
        value = value/2;
    }
    return conversion;
}

最佳答案

问题在于:

fread(&charValue, sizeof(float),1, input);

那应该是
fread(charValue, sizeof(float),1, input);

因为charValue是指针。
为了解决输出中的问题,在使用0viacalloc对缓冲区进行完全初始化后,将其向后填充,因此fprintf正在点击0(achar用于表示字符串的结尾)并“过早”停止。
下面是一个快速的二进制字符串函数:
void fast_d2b(int x, char* c) {
    int i;
    for (i = 31; i >= 0; --i) {
        *(c++) = '0' + ((x >> i) & 0x1);
    }
}

它是基于显示的here
唯一的区别是,我的变量不会向后写入缓冲区,而是写入'0''1'而不是积分值01

关于c - 将小数转换为指数和尾数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15715622/

10-11 22:07
查看更多