c - 为什么这些可以声明为整数?

标签 c variables int fixed-point

在一个看起来运行良好的程序中,我有以下声明:

#include <stdio.h>
#include "system.h"

signed char input[4]; /* The 4 most recent input values */

char get_q7( void );
void put_q7( char );
void firFixed(signed char input[4]);

const int c0 = (0.0299 * 128 + 0.5); /* Converting from float to Q7 is multiplying by 2^n i.e. 128 = 2^7 since we use Q7 and round to the nearest integer*/
const int c1 = (0.4701 * 128 + 0.5);
const int c2 = (0.4701 * 128 + 0.5);
const int c3 = (0.0299 * 128 + 0.5);
const int half = (0.5000 * 128 + 0.5);

enum { Q7_BITS = 7 };

void firFixed(signed char input[4])
{
    int sum = c0*input[0] + c1*input[1] + c2*input[2] + c3*input[3];
    signed char output = (signed char)((sum + half) >> Q7_BITS);
    put_q7(output);
}

int main(void)
{   
    int a;
    while(1)
    {    
     for (a = 3 ; a > 0 ; a--)
    {
      input[a] = input[a-1];
    }      
     input[0]=get_q7();           
     firFixed(input);
    }
    return 0;
}

但我不明白如何将小数声明为 int,这是用常量完成的。它应该是 Q7 表示法,但为什么要这样做,编译器如何接受一个小数的 int?它会简单地取分数的整数部分吗?如果是这样,为什么不需要强制转换?

最佳答案

当浮点值转换为整数时,它会被截断。这意味着小数点后的所有数字都被简单地删除了。例如。 12.34 变为 1212.99 变为 12。没有四舍五入。

这就是 + 0.5 部分在初始化中所做的。它只是一种通过舍入将浮点值转换为整数的方法。例如,0.0299 * 1283.8272,截断为 3。但是对于 + 0.5,它是 4.3272,截断后变成 4,这是 3.8272 的舍入值。

但可能仍然存在问题,您可能需要阅读 What Every Computer Scientist Should Know About Floating-Point Arithmetic了解更多。

关于c - 为什么这些可以声明为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19224175/

相关文章:

python - 从 c 字符数组创建 PyString 而不复制

c - 如何获得指向结构的指针数组?

javascript - 如何获取函数内部创建的变量?

c - C 中 float 与 int 比较结果的类型

java - 值 setValueAt()

c - 如何使用#defines 最好地打开/关闭单元测试

c - C 中指向结构与 malloc 的指针?

python - 如何确定变量是否在 Python 中声明?

javascript - 如何在页面重新加载时清除 JavaScript 变量?

java - java中有math.substring这样的东西吗?