C++ 是否使用指针将uint16_t值注入uint8_t数组?

C++ 是否使用指针将uint16_t值注入uint8_t数组?,c++,C++,我试图使用指针将uint16\u t值插入uint8\u 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; uint

我试图使用指针将uint16\u t值插入uint8\u 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;

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

第一个版本将按计算机的顺序写入两个字节。大多数现代计算机都是小尾端,这意味着多字节整数值的最低有效字节在内存中排在第一位,因此这个版本将以与另一个版本相反的顺序写入这两个字节

我想这就是你看到的问题;如果是别的事情,那么请比“我没能做到”更具体一些


而且,第一个版本在技术上有未定义的行为,并且可能在一台足够奇特的计算机上做一些完全出乎意料的事情。我建议您坚持使用定义良好的代码,如第二个版本;只有当分析显示定义良好的代码太慢,并且不可靠的指针别名代码更快时,才使用可疑的优化。我还建议使用
重新解释施法
而不是邪恶的C型施法;它不会改变行为,但更容易看出有什么不稳定的地方。

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

第一个版本将按计算机的顺序写入两个字节。大多数现代计算机都是小尾端,这意味着多字节整数值的最低有效字节在内存中排在第一位,因此这个版本将以与另一个版本相反的顺序写入这两个字节

我想这就是你看到的问题;如果是别的事情,那么请比“我没能做到”更具体一些


而且,第一个版本在技术上有未定义的行为,并且可能在一台足够奇特的计算机上做一些完全出乎意料的事情。我建议您坚持使用定义良好的代码,如第二个版本;只有当分析显示定义良好的代码太慢,并且不可靠的指针别名代码更快时,才使用可疑的优化。我还建议使用
重新解释施法
而不是邪恶的C型施法;这不会改变行为,但更容易看到有不稳定的事情发生。

您可以这样做:

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];
uint8_t*value_data=reinterpret_cast(&value);//标准允许强制转换为`(无符号)字符*`
myarray[0]=值_数据[0];
myarray[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];
uint8_t*value_data=reinterpret_cast(&value);//标准允许强制转换为`(无符号)字符*`
myarray[0]=值_数据[0];
myarray[1]=值_数据[1];

第一个代码的具体问题是什么?不看太多细节,您似乎在“混叠”,以便两种不同类型的代码存在于同一内存中。如果左值是“兼容类型”(兼容类型仅通过添加有符号、无符号或易失性的任何组合而有所不同),则只能“别名”左值。对此主题进行一些浅显的解读:第一个代码到底有什么问题?不必过多地关注细节,您似乎是在“别名”所以两种不同的类型生活在同一个记忆中。如果左值是“兼容类型”(兼容类型的区别仅在于添加了有符号、无符号或易失性的任何组合),则只能使用“别名”左值。对这个主题有一些浅显的了解:我尝试过这样修改代码,它似乎起到了作用。这会有什么问题吗?uint8_t myarray[10];uint16_t值=10000;void*ptr=&myarray;uint16_t*myptr=((uint16_t*)ptr)+2*myptr=值>>8|value@user1142327:它依赖于未定义的行为,并且不可移植。正如我所说,如果你已经确定(a)定义良好的版本不够快,并且(b)不可靠的版本确实更快,那么你应该只使用像这样的不可靠的优化。我试着修改代码,它似乎可以工作。这会有什么问题吗?uint8_t myarray[10];uint16_t值=10000;void*ptr=&myarray;uint16_t*myptr=((uint16_t*)ptr)+2*myptr=值>>8|value@user1142327:它依赖于未定义的行为,并且不可移植。正如我所说的,如果您已经确定(a)定义良好的版本不够快,并且(b)不可靠的版本确实更快,那么您应该只使用这样的不可靠的优化。