首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定点带符号Q8到Q4格式的转换

定点带符号Q8到Q4格式的转换
EN

Stack Overflow用户
提问于 2010-10-05 22:16:30
回答 2查看 3.4K关注 0票数 1

我需要在c中从定点带符号的Q8 format转换成定点带符号的Q4 format,假设我可以做一个四位移位,对吗?我需要考虑符号位吗?

更新:这是针对ARM11架构的,但我更喜欢非架构特定的解决方案。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-05 22:44:05

位移位应该可以工作,并且还可以处理许多架构上的符号位。在负数的情况下,更多的1将被移入,但您将只使用较低的5位,或者在C中进行算术,其中您需要这些额外的位来形成正确的二进制补码。

假设是整型数,那么代码将会是:

代码语言:javascript
复制
int q4 = q8 >> 4;

也许你想转一转:

代码语言:javascript
复制
int ahalf = q8 >= 0 ? (1<<3) : (1<<3)-1;
int q4 = (q8+ahalf) >> 4;

好的,我听了Oli的话,并提出了一个解决方案,用于解决不能正确移动符号的架构:

代码语言:javascript
复制
int q4 = q8 / (1<<4);

如果可能,优化器应该将除法转换为移位。

对于四舍五入,第一个解决方案是

代码语言:javascript
复制
int ahalf = q8 >= 0 ? (1<<3) : -(1<<3);
int q4 = (q8+ahalf) / (1<<4);

由于R..的持久性,我最终测试了所有版本,它们现在在Linux下使用Intel 32位有符号整数产生了正确的结果。

票数 1
EN

Stack Overflow用户

发布于 2010-10-05 22:49:08

我知道C的右移行为是由实现定义的。请参阅标准的6.5.7/5

(一些计算机可能会复制MSB,如下图所示;其他计算机可能会添加'0')

关注符号位看起来不像是一件很大的工作。

但是,如果您的代码将仅在同一台机器上编译,那么您可以检查该机器的实现,并忽略符号位(如果它“有效”)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3864515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档