就是把十六进制转成二进制用补码求 然后在把二进制转成十进制 FBH最后的H表示的是16进制数 FB转成二进制就是 1111 1011 取反加1就是 1000 0101就是-5了 其中第一位不用取反了 ,因为是负数
带小数的二进制转十进制 看到的都是 理论 没有代码, 今天把自己的公布下,欢迎指正(部分是借用别人的)如有疏漏,恳请指出。
#include <stdio.h>
#include <string.h>
#include <math.h>
void fun2_10(char str[], int j, int len) //带小数的二进制转十进制
{
int k = j + 1; //将k指向小数部分第一位
int cetz = 0, cetx = -1;
double Sumz = 0;
double Sumx = 0;
if (str[0] == '1') // 符号位 == 1
{
// 逆补码
for (int i = j - 1; i > 0; i--)
{
str[i] -= 1;
if (str[i] == '0')
break;
else
str[i] = '1';
}
// 逆反码
for (int i = j - 1; i > 0; i--)
str[i] == '0' ? (str[i] = '1') : (str[i] = '0');
// 二转十公式
for (int i = j - 1; i > 0; i--) //整数部分逆向累加
{
Sumz += (str[i] - '0') * pow(2, cetz);
cetz++;
}
Sumz = 0 - Sumz; // 取负
}
else // 符号位 == 0
for (; j > 0; j--) //整数部分逆向累加
{
Sumz += (str[j - 1] - '0') * pow(2, cetz);
cetz++;
}
//
for (; k < len; k++) //小数部分正向累加
{
Sumx += (str[k] - '0') * pow(2, cetx);
cetx--;
}
printf("%lf\n", Sumz + Sumx); //整数部分加小数部分
}
int main()
{
int j, k;
char str[100];
strcpy(str, "001000010.1000010"); //66.515625
// strcpy(str, "101010111.1001010"); // -168.421875
int len = strlen(str); //统计字符串长度
for (j = 0; j < len; j++) //统计整数部分长度
{
if (str[j] == '.')
break;
}
fun2_10(str, j, len);
return 0;
}