【发布时间】:2019-06-04 07:24:54
【问题描述】:
我有一个使用 16 位浮点数的框架,我想分离它的组件然后用于 32 位浮点数。在我的第一种方法中,我使用了位移和类似方法,虽然这种方法有效,但阅读起来却非常混乱。
然后我想改用自定义位大小的结构,并使用联合来写入该结构。
重现问题的代码:
#include <iostream>
#include <stdint.h>
union float16_and_int16
{
struct
{
uint16_t Mantissa : 10;
uint16_t Exponent : 5;
uint16_t Sign : 1;
} Components;
uint16_t bitMask;
};
int main()
{
uint16_t input = 0x153F;
float16_and_int16 result;
result.bitMask = input;
printf("Mantissa: %#010x\n", result.Components.Mantissa);
printf("Exponent: %#010x\n", result.Components.Exponent);
printf("Sign: %#010x\n", result.Components.Sign);
return 0;
}
在示例中,我希望我的尾数为 0x00000054,指数为 0x0000001F,符号为 0x00000001
相反,我得到尾数:0x0000013f,指数:0x00000005,符号:0x00000000
这意味着首先从我的位掩码获取符号(第一位),接下来 5 位到指数,然后 10 位到尾数,所以顺序与我想要的相反。为什么会这样?
【问题讨论】:
-
注意:它甚至看起来不像是字节序之类的东西,无论出于何种原因,整个结构的顺序都是错误的
-
注意:从联合中活动字段以外的任何字段读取正式未定义行为。您的编译器可能使其合法(默认情况下或通过开关),但通过联合的类型双关语不是符合标准的 C++。
标签: c++ endianness bit-fields