浮点位移位

Bit shifting a floating-point

我正在进行一个将任何实数转换为定点数的项目。

例如下面的代码:

float ff = 8.125f;
std::cout << std::bitset<32>(ff) << std::endl; //print binary fotmat

输出:

00000000000000000000000000001000

只打印出整数部分

当我这样做时:

float ff = 8.125f;
int   va = ff * (1 << 8); //8bits shift left
    
std::cout << std::bitset<32>(va) << std::endl; //print binary fotmat

输出为:

00000000000000000000100000100000

小数部分也打印出来了。

我不明白为什么。

Only the integer part is printed out.

嗯,当然,因为这就是你给 bitset 的全部内容:there is no std::bitset constructor that takes a float argument,所以你的 ff 正在转换为 unsigned long long,这将丢失小数部分(因为任何浮点类型到整数类型的转换都会)。打开编译器警告会提醒您这一点;例如,对于您的第一个代码片段,MSVC 编译器显示:

warning C4244: 'argument': conversion from 'float' to 'unsigned __int64', possible loss of data

在您的第二个示例中,您将 float 值乘以 256 并转换为整数值 2080 - 这是传递给 bitset 的值。

如果您想要 float 变量在 bitset 中的 完整 按位表示,您需要先将该数据复制到 unsigned long long 变量并将其传递给构造函数:

    unsigned long long ffdata = 0;
    std::memcpy(&ffdata, &ff, sizeof(ff));
    std::cout << std::bitset<32>(ffdata) << std::endl;

输出:

01000001000000100000000000000000