0

我正在尝试使用指针将 uint16_t 值插入 uint8_t 数组。我认为下面会起作用,但无法做到。关于问题是什么的任何线索?

uint8_t myarray[10];
uint16_t value = 10000;
uint16_t * myptr = (uint16_t *)(myarray+2);
*myptr = value;

我知道我可以这样做,但为什么上面不起作用?

uint8_t myarray[10];
uint16_t value = 10000;
uint8_t * myptr = (myarray+2);
uint8_t * myptr2 =(myarray+3);
*myptr = value>>8;
*myptr2 =value;
4

2 回答 2

3

第二个版本将最高有效字节(值为 39)写入myarray[2],将最低有效字节(值为 16)写入myarray[3]

第一个版本将按照您计算机的字节序确定的顺序写入两个字节。大多数现代计算机都是little-endian,这意味着多字节整数值的最低有效字节首先出现在内存中 - 所以这个版本将以与另一个版本相反的顺序写入这两个字节。

我假设这就是您所看到的问题;如果是其他事情,那么请比“无法做到”更具体。

此外,第一个版本在技术上具有未定义的行为,并且可能在一台足够奇特的计算机上做一些完全出乎意料的事情。我建议你坚持使用像第二个版本这样定义明确的代码;如果分析显示定义明确的代码太慢,并且狡猾的指针别名代码更快,则仅使用可疑的优化。我还建议使用reinterpret_cast而不是邪恶的 C 风格演员;它不会改变行为,但更容易看出发生了一些不稳定的事情。

于 2012-10-03T04:24:53.617 回答
1

你可以这样做:

uint8_t * value_data = reinterpret_cast<uint8_t*>(&value); // cast to `(unsigned) char*` is allowed by standard
myarray[0] = value_data[0];
myarray[1] = value_data[1];
于 2012-10-03T04:41:04.080 回答