typedef struct
{
union {
uint32_t ss32;
struct {
unsigned int reserved1 : 16;
unsigned int scale : 8;
unsigned int reserved2 : 7;
unsigned int sign : 1;
} signscale;
} u;
uint32_t hi32;
uint32_t lo32;
uint32_t mid32;
} decimal_repr;
鉴于Decimal结构,我如何将其内部数据重建为人类可读的数字,例如123456.987654000123456?我找不到任何解释十进制结构的文档(左移或右移多少位,它的分数,尾数等)。
我还发现Decimal类会链接到libdec
,但我无法在项目源代码中的任何位置找到lib。如果有的话,我肯定只想重复使用它。
修改
我仍然坚持两个问题:
flags
是在上述结构中定义的16位左移值scale
; AND如果输入值为负,则必须屏蔽标志或将其最低有效位值设置为0x8000000。现在给定上面的struct数据,我想初始化Decimal类成员,尤其是flags
。
当然我可以将scale
值右移16位以获得flags
,但是如果sign
是1,这是负输入值,我对于逆运算是愚蠢的
flags|=0x8000000
。也就是说,从先前移位的比例中消除最低有效位值以获得原始flags
。答案 0 :(得分:3)
( - 1)^符号*(hi32 * 2 ^ 64 + mid32 * 2 ^ 32 + lo32)/ 10 ^规模
十进制数的二进制表示由1位符号,96位整数和用于除以整数的比例因子组成,并指定它的哪个部分是小数。缩放因子隐式地表示从0到28的指数10。MSDN
decimal_repr
直接对应Decimal
结构,它具有相同的相同字段。 flags
对应ss32
,hi
至hi32
,lo
至lo32
和mid
至mid32
。因此,如果你有数据结构,那么你已经有了Decimal结构,不需要转换。如果您想从sing
清除flags
标记,那么您可以执行此操作:flags&=0x7fffffff
。