gpt4 book ai didi

c++ - 将int位转换为逐字浮点并打印

转载 作者:行者123 更新时间:2023-12-01 14:53:06 25 4
gpt4 key购买 nike

我试图只复制要用作浮点数的32位无符号整数的内容。不强制转换,只是重新解释要用作浮点数的整数位。我知道memcpy是最建议的选择。但是,当我从uint_32执行memcpy使其 float 并打印出各个位时,我发现它们是完全不同的。

这是我的代码段:

#include <iostream>
#include <stdint.h>
#include <cstring>

using namespace std;

void print_bits(unsigned n) {
unsigned i;
for(i=1u<<31;i > 0; i/=2)
(n & i) ? printf("1"): printf("0");
}

union {
uint32_t u_int;
float u_float;
} my_union;

int main()
{
uint32_t my_int = 0xc6f05705;
float my_float;
//Method 1 using memcpy
memcpy(&my_float, &my_int, sizeof(my_float));
//Print using function
print_bits(my_int);
printf("\n");
print_bits(my_float);
//Print using printf
printf("\n%0x\n",my_int);
printf("%0x\n",my_float);
//Method 2 using unions
my_union.u_int = 0xc6f05705;
printf("union int = %0x\n",my_union.u_int);
printf("union float = %0x\n",my_union.u_float);
return 0;
}

输出:
11000110111100000101011100000101
11111111111111111000011111010101
c6f05705
400865
union int = c6f05705
union float = 40087b

有人可以解释发生了什么吗?我期望位匹配。也没有与工会合作。

最佳答案

您需要将函数print_bits更改为

inline
int is_big_endian(void)
{
const union
{
uint32_t i;
char c[sizeof(uint32_t)];
} e = { 0x01000000 };

return e.c[0];
}

void print_bits( const void *src, unsigned int size )
{
//Check for the order of bytes in memory of the compiler:
int t, c;
if (is_big_endian())
{
t = 0;
c = 1;
}
else
{
t = size - 1;
c = -1;
}
for (; t >= 0 && t <= size - 1; t += c)
{ //print the bits of each byte from the MSB to the LSB
unsigned char i;
unsigned char n = ((unsigned char*)src)[t];
for(i = 1 << (CHAR_BIT - 1); i > 0; i /= 2)
{
printf("%d", (n & i) != 0);
}
}
printf("\n");
}

并这样称呼它:
int a = 7;
print_bits(&a, sizeof(a));

这样,当您调用print_bits时就不会进行任何类型转换,并且适用于任何结构大小。

编辑:我用CHAR_BIT-1代替了7,因为字节的大小可以不同于8位。

编辑2:我添加了对小端和大端编译器的支持。

也如注释中建议的@ M.M所示,可以使用模板进行函数调用: print_bits(a)而不是 print_bits(&a, sizeof(a))

关于c++ - 将int位转换为逐字浮点并打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61021906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com