C++ 隐蔽指针uint8到指针uint 16? int main { uint8_t a[3]={0x4,0x3,0x1}; uint16_t b=*((uint16_t*)a); 您需要在谷歌上搜索一下数组在内存中的存储方式。 当你申报时 int main { uint8_t a[3] ={0x4,0x3,0x1}; uint16_t b= *((uint16_t *) a); cout << (int)b; }

C++ 隐蔽指针uint8到指针uint 16? int main { uint8_t a[3]={0x4,0x3,0x1}; uint16_t b=*((uint16_t*)a); 您需要在谷歌上搜索一下数组在内存中的存储方式。 当你申报时 int main { uint8_t a[3] ={0x4,0x3,0x1}; uint16_t b= *((uint16_t *) a); cout << (int)b; },c++,C++,您创建了一个占用3个字节并包含3个元素的内存块(不考虑填充,这是另一个主题) 所以 uint8_t a[3] = {0x4,0x3,0x1}; 你进入了记忆 uint8_t a[3] = {0x4,0x3,0x1}; uint16_t a[3] = {0x4,0x3,0x1}; 当访问16位变量时,编译器需要3个元素,每个元素2个字节,总共6个字节 Byte1: 0x4 Byte2: 0x3 Byte3: 0x1 你进入了记忆 uint8_t a[3] = {0x4,0x3,0x1};

您创建了一个占用3个字节并包含3个元素的内存块(不考虑填充,这是另一个主题)

所以

uint8_t a[3] = {0x4,0x3,0x1};
你进入了记忆

uint8_t a[3] = {0x4,0x3,0x1};
uint16_t a[3] = {0x4,0x3,0x1};
当访问16位变量时,编译器需要3个元素,每个元素2个字节,总共6个字节

Byte1: 0x4
Byte2: 0x3
Byte3: 0x1
你进入了记忆

uint8_t a[3] = {0x4,0x3,0x1};
uint16_t a[3] = {0x4,0x3,0x1};
在您的例子中,当您将uint8_t数组强制转换为uint16_t时,您将0x4和0x3合并到0x304中,正如您所知,0x304是772


<>希望这有助于

,但是C++在十六进制中是更偏执的.77是0x0304。你可以从那里开始假设,但是记住它们只是假设。注意这是未定义的行为。只有在指针指向的地方有给定类型的对象时,你才能去引用指针。有一些例外,但是这些。不要在此处应用。在这种情况下,地址
(uint16\u t*)a
处没有类型为
uint16\u t
的对象。您可以安全地执行
memcpy(&b,a,sizeof(uint16\u t));