对于16位数据,我应该使用什么而不是putchar()?

时间:2018-06-05 22:42:34

标签: c gcc

我是C的新手,编写了一个简单的程序,它生成一个具有指定频率和采样率的正弦波,并将其作为无符号的8位字节发送到stdout。

#include <stdio.h>
#include <math.h>
#include <stdint.h>

uint8_t sinco(int iCarrier, int iSampleRate, unsigned long ulIndex){return (sin(iCarrier * (2 * M_PI) * ulIndex / iSampleRate) * 127) + 128;}

void main(){    
    unsigned long t;
    const int iCarrier = 500;
    const int iSampleRate = 8000;

    for(t=0;;t++){
        putchar(sinco(iCarrier, iSampleRate, t));
    }
}

我意识到putchar()不是最合适的功能,但它适用于我当时需要的功能。现在我正在尝试修改程序以输出无符号的16位数,但我不知道用什么替换putchar()。

这是我到目前为止所做的:

#include <stdio.h>
#include <math.h>
#include <stdint.h>

uint16_t sinco(int iCarrier, int iSampleRate, unsigned long ulIndex){return (sin(iCarrier * (2 * M_PI) * ulIndex / iSampleRate) * 65535) + 65536;}

void main(){    
    unsigned long t;
    const int iCarrier = 500;
    const int iSampleRate = 8000;

    for(t=0;;t++){
        printf(%hu, sinco(iCarrier, iSampleRate, t));
    }
}

然而,一旦该值大于65,536,程序就会开始向stdout发送32位。是否有更好的替代方案可以使用putchar,它会正确地包裹?

1 个答案:

答案 0 :(得分:2)

您希望输出以两个字节编码的值。所以连续输出这两个字节。哪两个字节?这取决于16位值应该如何编码为两个8位值,即系统的endianness将读取这两个字节。

小端:

Secondary_Group_A

大端:

uint16_t w = sinco(…);
putchar(w & 0xff);
putchar((w >> 8) & 0xff);

如果读取值的系统具有与CPU相同的字节顺序,则可以使用不同的策略:通过转储其内存内容来写入值。您可以将内存中的任何值读取为字节数组,并且可以使用uint16_t w = sinco(…); putchar((w >> 8) & 0xff); putchar(w & 0xff); 来写入字节数组。

fwrite