64位和32位定点数之间的转换

问题描述 投票:0回答:2

如何将数据从Q33.31格式转换为Q2.30格式?我知道,如果输入和输出的位大小相同,则需要使用移位运算符。但是如何计算它们的大小是否不同?

c bit-shift fixed-point
2个回答
0
投票

怎么样:

uint32_t convert(uint64_t x)
{
    uint32_t hi = (uint32_t)(x >> 32);
    uint32_t lo = (uint32_t)(x);
    if (hi >= (1 << 2) || lo >= (1 << 30))
        // handle input-too-large-or-too-accurate error and exit
    return (hi << 30) | lo;
}

或者,处理if语句中的错误输入(如果您不关心可能的信息丢失,则可以简单地单击return (hi << 30) | ((lo << 2) >> 2);


0
投票

在对@goodvibration答案的评论中,您声明要添加两个Q1.31数字。鉴于此,您知道结果可以表示为Q2.31,因此要将Q2.31数转换为Q2.30,只需将结果右移一位:

uint32_t convert_q231_q230(uint64_t x)
  {
  return (uint32_t) (x >> 1);
  }
© www.soinside.com 2019 - 2024. All rights reserved.