1.使用VS进行验证
//编程环境:
//操作系统:windows 10
//编程工具:VS2021
//编程语言:c/c++语言
#include <iostream>
#include <stdio.h>
//整数转r进制
//integer:整数 radix:进制 result:结果数组 num:生成r进制所占位数
void D1toB(int integer, int radix, int result[], int& num)
{
int i, j, n;
for (i = 0; integer > 0; i++)//除r取余
{
result[i] = integer % radix;
integer = integer / radix;
}
num = i;//r进制位数
for (j = 0; j < i / 2; j++)//颠倒顺序
{
n = result[j];
result[j] = result[i - 1 - j];
result[i - 1 - j] = n;
}
}
//小数转r进制
//decimal:小数 radix:进制 result:结果数组 num:生成r进制所占位数
void D2toB(float decimal, int radix, int result[], int& num)
{
int i;
for (i = 0; decimal > 0 && i < 50; i++)//乘r取整
{
result[i] = decimal * radix;
decimal = decimal * radix;
decimal = decimal - int(decimal);
}
num = i;
}
void float_to_IEEE754(float number)
{
int integer;//整数部分
float decimal;//小数部分
int s, p[8], m[50];//浮点数符号位,阶码数,尾数
int i, j;
for (i = 0; i < 8; i++)//清零
{
p[i] = 0;
}
for (i = 0; i < 50; i++)
{
m[i] = 0;
}
//确定符号位
if (number > 0)
{
s = 0;
}
else
{
s = 1;
number = -number;
}
//将浮点数分成整数和小数
integer = (int)number;
decimal = number - integer;
//分别将整数和小数转化成二进制
int m_n1, m_n2;
D1toB(integer, 2, m, m_n1);
D2toB(decimal, 2, m + m_n1, m_n2);
//规格化,计算阶数, 尾数
int pn = 0;//阶数
if (integer > 0)//小数点左移
{
pn = m_n1 - 1;//阶数
for (i = 0; i < 23; i++)//去掉首位默认的1
{
m[i] = m[i + 1];
}
}
else//小数点右移
{
for (i = 0; m[i] == 0; i++)
{
}
pn = -i - 1;
for (j = 0; j < 23; j++)//去掉左边无效的0和第一个的1
{
m[j] = m[j + 1 + i];
}
}
//计算阶码
int p1[8], pn1;
D1toB(pn + 127, 2, p1, pn1);//阶数转二进制
if (pn1 < 8)//不足8位左边补0
{
for (j = 0; j < 8 - pn1; j++)
{
p[j] = 0;
}
for (int k = 0; k < pn1; k++)//得出完整p
{
p[j + k] = p1[k];
}
}
else
{
for (i = 0; i < 8; i++)//得出完整p
{
p[i] = p1[i];
}
}
//输出s
printf("%d", s);
//输出p
for (i = 0; i < 8; i++)
{
printf("%d", p[i]);
}
printf(" "); //输出s
//输出m
for (i = 0; i < 23; i++)
{
printf("%d", m[i]);
}
printf("\n\n");
int array1[32];
memset(array1, 0, 32);
array1[0] = s;
memcpy(array1 + 1, p, 8 * sizeof(int));
memcpy(array1 + 9, m, 22 * sizeof(int));
for (i = 0; i < 32; i++)
{
printf("%d", array1[i]);
}
printf("\n\n");
int res[8];
int k = 0;
for (i = 0; i < 32; i += 4)
{
res[k] = array1[i] * 8 + array1[i + 1] * 4 + array1[i + 2] * 2 + array1[i + 3];
k++;
}
for (i = 0; i < k; i++)
{
printf("%x", res[i]);
}
printf("\n\n");
}
int main()
{
while (true)
{
float number;//输入的浮点数
printf("请输入一个浮点数:");
scanf_s("%f", &number);
printf("%d",sizeof(number));
getchar(); //取走回车符
float_to_IEEE754(number);
}
return 0;
}
输出结果

2.用于STM32F103单片机HAL库
//整数转r进制
// integer:整数 radix:进制 result:结果数组 num:生成r进制所占位数
int D1toB(int integer, int radix, int result[])
{
int i, j, n;
for (i = 0; integer > 0; i++) //除r取余
{
result[i] = integer % radix;
integer = integer / radix;
}
for (j = 0; j < i / 2; j++) //颠倒顺序
{
n = result[j];
result[j] = result[i - 1 - j];
result[i - 1 - j] = n;
}
return i;
}
//小数转r进制
// decimal:小数 radix:进制 result:结果数组 num:生成r进制所占位数
int D2toB(float decimal, int radix, int result[])
{
int i;
for (i = 0; decimal > 0 && i < 50; i++) //乘r取整
{
result[i] = decimal * radix;
decimal = decimal * radix;
decimal = decimal - (int)decimal;
}
return i;
}
void float_to_IEEE754(float number)
{
int integer; //整数部分
float decimal; //小数部分
int s, p[8], m[50]; //浮点数符号位,阶码数,尾数
int i, j;
memset(p, 0, 8 * sizeof(int));
memset(m, 0, 50 * sizeof(int));
//确定符号位
if (number > 0)
{
s = 0;
}
else
{
s = 1;
number = -number;
}
//将浮点数分成整数和小数
integer = (int)number;
decimal = number - integer;
//分别将整数和小数转化成二进制
int m_n1, m_n2; // r进制位数
m_n1 = D1toB(integer, 2, m);
m_n2 = D2toB(decimal, 2, m + m_n1);
//规格化,计算阶数, 尾数
int pn = 0; //阶数
if (integer > 0) //小数点左移
{
pn = m_n1 - 1; //阶数
for (i = 0; i < 23; i++) //去掉首位默认的1
{
m[i] = m[i + 1];
}
}
else //小数点右移
{
for (i = 0; m[i] == 0; i++)
{
}
pn = -i - 1;
for (j = 0; j < 23; j++) //去掉左边无效的0和第一个的1
{
m[j] = m[j + 1 + i];
}
}
//计算阶码
int p1[8], pn1;
pn1 = D1toB(pn + 127, 2, p1); //阶数转二进制
if (pn1 < 8) //不足8位左边补0
{
for (j = 0; j < 8 - pn1; j++)
{
p[j] = 0;
}
for (int k = 0; k < pn1; k++) //得出完整p
{
p[j + k] = p1[k];
}
}
else
{
for (i = 0; i < 8; i++) //得出完整p
{
p[i] = p1[i];
}
}
uint8_t array32[32];
memset(array32, 0, 32);
array32[0] = (uint8_t)s;
for (i = 0; i < 8; i++)
{
array32[i + 1] = (uint8_t)p[i];
}
for (i = 0; i < 22; i++)
{
array32[i + 9] = (uint8_t)m[i];
}
//HAL_UART_Transmit(&huart1, array32, sizeof(array32),100);
uint8_t array[7];
memset(array, 0, 7);
array[0] = 0xAA;
array[1] = 0xBB;
array[2] = 0x04; //数据长度
int k = 3;
for (i = 0; i < 32; i += 8)
{
array[k] &= 0x0f;
array[k] |= (array32[i] * 8 + array32[i + 1] * 4 + array32[i + 2] * 2 + array32[i + 3]) << 4;
array[k] &= 0xf0;
array[k] |= (array32[i + 4] * 8 + array32[i + 5] * 4 + array32[i + 6] * 2 + array32[i + 7]);
k++;
}
HAL_UART_Transmit(&huart1, array, sizeof(array), 100);
}