使用指针将uint16_t值注入uint8_t数组?

时间:2012-10-03 03:59:07

标签: c++

我试图使用指针将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;

2 个答案:

答案 0 :(得分:3)

第二个版本将最重要的字节(值39)写入myarray[2],将最低值(值16)写入myarray[3]

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

我认为这就是你所看到的问题;如果它是别的东西,那么请比“无法做到”更具体。

此外,第一个版本在技术上具有未定义的行为,并且可能在充满异国情调的计算机上做出完全意外的事情。我建议你坚持使用定义良好的代码,比如第二个版本;如果分析显示定义良好的代码太慢,并且狡猾的指针别名代码更快,则只使用可疑的优化。我还建议使用reinterpret_cast而不是邪恶的C风格演员;它不会改变行为,但会更容易看到有些事情会发生。

答案 1 :(得分: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];