gpt4 book ai didi

在 C 中类型转换 : gotchas

转载 作者:太空狗 更新时间:2023-10-29 15:44:24 26 4
gpt4 key购买 nike

我正在用 C 语言对 Atmel SAMD20 进行编程。我遇到了一个错误,我现在已经修复了这个错误,但我不太清楚为什么它首先会发生。有人可以指出给我吗? (这可能太明显了,我稍后会打脸。)

一组传感器正在生成 uint16_t 数据,我将其转换为 uint8_t 以通过 I2C 发送。所以,我最初是这样写的:

for (i = 0; i < SENSBUS1_COUNT; ++i)
{
write_buffer[ (i*2) ] = (uint8_t) sample_sensbus1[i] & 0xff;
write_buffer[(i*2)+1] = (uint8_t) sample_sensbus1[i] >> 8;
}

这里,write_bufferuint8_tsample_sensbus1uint16_t

出于某种原因,这最终会弄乱最高有效字节(在大多数情况下,最高有效字节仅为 1(即 0x100))。另一方面,这工作正常,并且正是它应该的样子:

for (i = 0; i < SENSBUS1_COUNT; ++i)
{
write_buffer[ (i*2) ] = sample_sensbus1[i] & 0xff;
write_buffer[(i*2)+1] = sample_sensbus1[i] >> 8;
}

显然,隐式转换比我聪明。

这是怎么回事?

最佳答案

write_buffer[(i*2)+1] = (uint8_t) sample_sensbus1[i] >> 8;

这相当于:

write_buffer[(i*2)+1] = ((uint8_t) sample_sensbus1[i]) >> 8;

如您所见,它会在转换之前进行转换。您最重要的字节现在不见了。

不过这应该可行:

write_buffer[(i*2)+1] = (uint8_t) (sample_sensbus1[i] >> 8);

关于在 C 中类型转换 : gotchas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47184465/

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