我是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,它会正确地包裹?
答案 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