gpt4 book ai didi

c - 对于 16 位数据,我应该使用什么来代替 putchar() ?

转载 作者:行者123 更新时间:2023-12-02 15:10:50 25 4
gpt4 key购买 nike

我对 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 的更好替代方案吗?它可以正确环绕?

最佳答案

您想要输出一个以两个字节编码的值。所以依次输出这两个字节。哪两个字节?这取决于如何将 16 位值编码为两个 8 位值,即 endianness将读取这两个字节的系统。

小尾数:

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

大尾数:

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

如果读取该值的系统与您的 CPU 具有相同的字节序,那么您可以使用不同的策略:通过转储其内存内容来写入该值。您可以将内存中的任何值作为字节数组读取,并且可以使用 fwrite 写入字节数组。

uint16_t w = sinco(…);
fwrite(&w, 1, 2, stdout);

关于c - 对于 16 位数据,我应该使用什么来代替 putchar() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50709925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com