如何将二进制数(32位)转换为十进制数?

问题描述:

我见过各种程序,我可以将给定的十进制浮点数转换为IEEE 754格式的二进制文件。
现在,给定一个二进制数,我如何让程序在C中将其转换为浮点数?如何将二进制数(32位)转换为十进制数?

例子:

Input: 01000001010010000000000001111111 
Output: 12.50012111663818359375 
+2

大多数情况下,我们通过编写一些代码开始。你写了什么吗? – 2015-04-01 08:49:46

+1

你确定在IEEE 754格式中有*十进制浮点数*和*二进制*吗?你的输入看起来像一个二进制表示,可能是一个字符串,你可以使用'strtol'来解析它,输出可能是由'printf(“%f”,f)''执行的字符串转换,所以你有一些提示开始编码... – chqrlie 2015-04-01 09:06:30

+0

嗯这适用于标题问题。 '01000001010010000000000001111111 binary' - >'1095237759 decimal'。 – chux 2015-04-01 17:17:14

我假设你有二进制表示为string

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

void setBit(uint32_t* f, int i) { 
    uint32_t mask = ((uint32_t)1) << i; 
    *f |= mask; 
} 

float readFloat(const char* bits) { 
    assert(strlen(bits)==8*sizeof(float)); 
    assert(sizeof(uint32_t)==sizeof(float)); 
    float f = 0; 
    int size = strlen(bits); 
    for (int i = 0; i < size; i++) { 
     int bit = bits[size-i-1]- 0x30; 
     if (bit) { 
      setBit((uint32_t*)&f, i); 
     } 
    } 
    return f; 
} 

int main(int argc, char *argv[]){ 
    const char* bits = "01000001010010000000000001111111"; 
    float f = readFloat(bits); 
    printf("%s -> %.20f", bits, f); 
} 

给人

01000001010010000000000001111111 - > 12.50012111663818359375

+0

@chux Thx编辑 – 2015-04-01 20:04:47

+0

如果你关心16位平台的可移植性(2015年嵌入式词汇流行),uint32_t mask = 1u chux 2015-04-01 21:35:33