我有一项作业,要求我将浮点数转换为IEEE 754二进制表示形式。 我已经完成了部分操作,但是我不知道如何将数字分成几部分(信号,指数和小数)。 这是我的代码:

typedef unsigned char Byte;

void showbits(char str[], Byte data[], int size) {

    int i, j;
    int bit;



    printf ("%s = ", str);

    for(i = size-1; i>=0; i--){
        for(j = 7; j >= 0; j--){
            bit = (data[i] >> j) & 1;

            printf ("%d", bit);
        }
        printf (" ");
    }
    printf ("\n");
    printf("signal: %d\n", (data[size - 1] >> 7) & 1);

    printf("exponential: ");

            printf("%d", (data[size-2] >> 6) & 1);
            printf("%d", (data[size-3] >> 5) & 1);
            printf("%d", (data[size-4] >> 4) & 1);
            printf("%d", (data[size-5] >> 3) & 1);
            printf("%d", (data[size-6] >> 2) & 1);
            printf("%d", (data[size-7] >> 1) & 1);
            printf("%d", (data[size-8] >> 0) & 1);
            printf("%d", (data[size-9] >> 7) & 1);

    printf("\nfraction: ");

            printf("%d", (data[21] >> 6) & 1);
            printf("%d", (data[20] >> 5) & 1);
            printf("%d", (data[19] >> 4) & 1);
            printf("%d", (data[18] >> 3) & 1);
            printf("%d", (data[17] >> 2) & 1);
            printf("%d", (data[16] >> 1) & 1);
            printf("%d", (data[15] >> 0) & 1);
            printf("%d", (data[14] >> 7) & 1);
            printf("%d", (data[13] >> 6) & 1);
            printf("%d", (data[12] >> 5) & 1);
            printf("%d", (data[11] >> 4) & 1);
            printf("%d", (data[10] >> 3) & 1);
            printf("%d", (data[9] >> 2) & 1);
            printf("%d", (data[8] >> 1) & 1);
            printf("%d", (data[7] >> 0) & 1);
            printf("%d", (data[6] >> 7) & 1);
            printf("%d", (data[5] >> 6) & 1);
            printf("%d", (data[4] >> 5) & 1);
            printf("%d", (data[3] >> 4) & 1);
            printf("%d", (data[2] >> 3) & 1);
            printf("%d", (data[1] >> 2) & 1);
            printf("%d", (data[0] >> 1) & 1);

}

int main(int argc, const char * argv[]) {

    float f;

    scanf("%f", &f);

    showbits("float", (Byte *)&f, sizeof(float));

    return 0;
}

另外,有人可以解释一下为什么会有一个从7开始到0的循环吗? 我没有做那部分...谢谢!

#1楼 票数:1

“另外,有人可以向我解释为什么那里有一个循环从7开始到0吗?我没有做那部分……谢谢!”

此循环将处理一个字节-因为一个字节是8位,所以从7开始将包含0。其中的&1部分是确保变量位中仅存储单个位。 该循环的功能是逐位打印出字节。

由于您完成了位部分,因此可以将其存储到uint32_t之类的值中,或者如果值不大于31(则对结果有影响的符号),则可以将其存储为int值。

例如

uint32_t exp = 0;
printf("exponential: ");

        exp |= ((data[size-2] >> 6) & 1) << 7;
        exp |= ((data[size-3] >> 5) & 1) << 6;
        exp |= ((data[size-4] >> 4) & 1) << 5;
        exp |= ((data[size-5] >> 3) & 1) << 4;
        exp |= ((data[size-6] >> 2) & 1) << 3;
        exp |= ((data[size-7] >> 1) & 1) << 2;
        exp |= ((data[size-8] >> 0) & 1) << 1;
        exp |= (data[size-9] >> 7) & 1;

这将按照打印出来的顺序存储位。

  ask by Pedro Cabaço translate from so

未解决问题?本站智能推荐:

1回复

二进制中的浮点表示

我正在尝试打印存储在 C 中的浮点数中的数字,但我正在努力将其打印出来。 我现在正在这样做,以 IEEE 格式打印数字。 我希望它直接从记忆中反向打印。 我该如何解决? 谢谢
1回复

在C中将浮点数转换为IEEE格式

我需要将浮点数转换为 IEEE(浮点数由 scanf 给出,它必须来自 scanf,否则它会丢失并出错),但我似乎无法让它工作。 我尝试使用 argc 和 argv 并且它是正确的,但我的提交平台不接受它,因为我需要通过扫描获取浮点数。 问题是因为我试图使用扫描,它不会打印正确的位。 数字 10 的
6回复

通过fopen访问C中的二进制MP3标头

我正在尝试从文件中提取mp3标头。 这与ID3标签不同-mp3标头是保存有关MPEG版本,比特率,频率等信息的位置。 您可以在此处查看mp3标头结构的概述: http : //upload.wikimedia.org/wikipedia/commons/0/01/Mp3filestruct
3回复

如何在没有填充位的情况下在C中输出二进制文件

我想将结构数据输出到二进制文件,但每个变量的信息之间没有任何填充位。 例如: 如果我使用fwrite(&example, sizeof(struct s), 2, file) ,二进制文件仍然具有填充位,例如, s1和c1 ,以及c1到i1 (of the 2nd struct)之
2回复

二维数组中的8位二进制组合[关闭]

我想知道如何在C编程中将8位二进制数的所有组合放入二维数组中。 256x8大小的数组以及0和1的所有组合应填写在数组中。 从00000000到11111111
2回复

K&R练习3-4:以二进制表示的负数

我很难理解此练习: 在二进制补码表示中,我们的itoa版本不处理最大的负数,即n的值等于-(2 ^(wordsize-1))。 解释为什么不。 修改它以正确打印该值,而与运行它的计算机无关。 这是itoa最初的样子: 我找到了这个答案,但我不明白其中的解释: http : //
2回复

计算二进制文件中32位数的数量

我正在制作一个程序,我应该跟踪二进制文件中有多少32位数。 例如,当输入总共4x32位的文件时:01001001010010010010100101001011010010001001010010010010100101000101010001001001010010010001000101
2回复

二进制文件和文本文件在存储方面的区别?

我想问几个关于位和字节的问题,因为我很困惑。 例如,假设我有一个short int x = 345; 。 我知道short占用16位,所以当我在文件中写入short时,它将写为char'3','4','5',每个包含1个字节,总共24位。 有没有一种方法可以将文件中的数字(短整数)写