【问题标题】:Why can these be declared as integers?为什么这些可以声明为整数?
【发布时间】:2013-10-13 23:41:40
【问题描述】:

在一个似乎运行良好的程序中,我有以下声明:

#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?它会只取分数的整数部分吗?如果是,为什么不需要强制转换?

【问题讨论】:

    标签: c variables int fixed-point


    【解决方案1】:

    当浮点值转换为整数时,它会被截断。这意味着简单地删除小数点后的所有数字。例如。 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 以了解更多信息。

    【讨论】:

      【解决方案2】:

      只有在类型提升而不是类型截断的情况下才需要强制转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        相关资源
        最近更新 更多