#include <stdio.h>
#define LEN 32
char bin[LEN] = {0};
void bitset(float a, char *bin)
{
unsigned int t = *(unsigned int *)(&a);
for (int i = LEN - 1; i >= 0; i--)
{
bin[i] = (t >> (LEN - i - 1)) & 1;
}
}
void print_bin(char *bin, int s, int e)
{
for (int i = s; i < e && i < LEN; i++)
printf("%d", bin[i]);
// printf("\n");
}
void print_float_as_binary(char *bin, int s, int e)
{
printf("Sign:");
print_bin(bin, 0, 1);
printf("\nExp:");
print_bin(bin, 1, 9);
printf("\nMantissa:");
print_bin(bin, 9, 32);
printf("\n");
}
int main(void)
{
float a = 1.4142136;
// printf("Enter a float number: ");
// scanf("%f", &a);
bitset(a, bin);
print_float_as_binary(bin, 0, LEN);
return 0;
}
Sign:0
Exp:01111111
Mantissa:01101010000010011110100
这个不是最入门的吗。
#include <stdio.h>
void printFloatAsBinary(float a) {
unsigned int floatAsInt = *(unsigned int*)(&a);
unsigned int sign = floatAsInt >> 31;
unsigned int exponent = (floatAsInt >> 23) & 0xFF;
unsigned int mantissa = floatAsInt & 0x7FFFFF;
printf("Sign: %u\n", sign);
printf("Exponent: %u\n", exponent);
printf("Mantissa: ");
for (int i = 0; i < 23; i++) {
printf("%u", (mantissa >> i) & 1);
}
printf("\n");
}
int main() {
float a;
printf("Enter a float number: ");
scanf("%f", &a);
printFloatAsBinary(a);
return 0;
}
凑个热闹, 二进制在C中一般不可移植, 我的代码是在window10 64 系统中的, printf中用了UB格式代码
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
uint32_t Mantissa : 23;
uint32_t Exponent : 8;
uint32_t Sign : 1;
} fltToBit;
void print_float_as_binary(float a)
{
char BufExponet[32] = "";
char BufMantissa[32] = "";
fltToBit test = *(fltToBit *)&a;
printf("Sign: %u\nExponent: %08s\nMantissa: %023s\n", test.Sign,
itoa(test.Exponent, BufExponet, 2),
itoa(test.Mantissa, BufMantissa, 2));
}
int main()
{
const float a = 1.4142136F;
print_float_as_binary(a);
return 0;
}
【以下回答由 GPT 生成】
我可以将给定的C++代码翻译成等价的C语言代码。以下是转换后的代码:
#include<stdio.h>
#include<stdint.h>
union FloatIntUnion {
float f;
uint32_t i;
};
void print_float_as_binary(float a) {
union FloatIntUnion fiu;
fiu.f = a;
uint32_t float_as_int = fiu.i;
char binary_repr[33];
binary_repr[32] = '\0';
for (int i = 31; i >= 0; i--) {
binary_repr[i] = (float_as_int & 1) + '0';
float_as_int >>= 1;
}
// 根据IEEE754标准解析
printf("Sign: %c\n", binary_repr[31]);
printf("Exponent: %s\n", binary_repr + 23);
printf("Mantissa: %s\n", binary_repr);
}
int main() {
float a;
printf("请输入一个浮点数: ");
scanf("%f", &a);
print_float_as_binary(a);
return 0;
}
解释: 1. 我们使用了一个联合体 FloatIntUnion
,其中包含一个 float
类型的变量和一个 uint32_t
类型的变量。这样我们可以将一个 float
类型的值以二进制整数的方式解析。 2. 我们使用数组 binary_repr
来存储二进制表示的浮点数。这里使用字符数组而不是 std::bitset
,其中每个字符表示一个二进制位。 3. 在 print_float_as_binary
函数中,我们首先将 float
类型的输入转换成 uint32_t
类型的整数。 4. 然后,我们使用循环将整数转换成二进制字符串,将结果存储在 binary_repr
数组中。 5. 最后,我们使用 printf
函数来打印解析后的二进制表示。
希望以上解决方案对您有帮助!如果您有任何问题,请随时提问。
【相关推荐】