我正在使用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_buffer
是 uint8_t
类型,而 sample_sensbus1
是 uint16_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;
}
显然,隐式转换比我更聪明。
发生了什么?
uint16_t
数组的uint8_t *
,那么它们被截断就不会有问题,因为您可以使用字节索引来索引整个数据集(uint8_t
数组中的元素数量将是原数组的两倍)。但正如您提到的字节序一样,这确实提醒我字节顺序实际上取决于系统。 - Christian Gibbonsuint16_t
强制转换为uint8_t
,你仍然会截断更重要的字节。但是,如果你将指针——即uint16_t *
强制转换为uint8_t *
,在大端系统上解引用时确实会丢失较不重要的字节。 - Charles Srstka