C++ 将16位整数复制到两字节数组

C++ 将16位整数复制到两字节数组,c++,arrays,memory,endianness,C++,Arrays,Memory,Endianness,我想知道为什么当我将一个16位的数字复制到一个两字节数组时,它只会复制到数组的第一个索引。 我的代码如下: #include <iostream> #include <stdint.h> #include <stdio.h> #include <cstring> using namespace std; int main(){ uint16_t my_num = 1; // This should be 0000 0000 000

我想知道为什么当我将一个16位的数字复制到一个两字节数组时,它只会复制到数组的第一个索引。 我的代码如下:

#include <iostream>
#include <stdint.h>
#include <stdio.h>
#include <cstring>



using namespace std;


int main(){
    uint16_t my_num = 1; // This should be 0000 0000 0000 0001, right?
    unsigned char my_arr[2]; // This should hold 16 bits, right?

    memcpy(my_arr, &my_num, sizeof(my_num)); // This should make my_arr = {00000000, 00000001}, right?

        printf("%x ", my_arr[0]);
        printf("%x ", my_arr[1]);
        cout << endl;
        // "1 0" is printed out


        return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
uint16\u t my\u num=1;//这应该是0000 0001,对吗?
unsigned char my_arr[2];//这应该包含16位,对吗?
memcpy(my_arr,&my_num,sizeof(my_num));//这应该使my_arr={00000000,00000001},对吗?
printf(“%x”,my_arr[0]);
printf(“%x”,my_arr[1]);
cout这是因为您的平台。多字节
uint16\u t
的字节首先存储在地址空间的最低字节中。您可以通过使用大于256的数字尝试相同的程序来查看发生了什么:

uint16_t my_num = 0xABCD;
结果将在第一个字节中包含
0xCD
,在第二个字节中包含
0xAB


您可以使用中的函数强制特定的尾数。

您的计算机似乎是小尾数。连续字节存储在“反向”中订单——首先是
0x01
,然后是
0x00
。看起来像是endianness妨碍了你,因为你可能已经得到了
00000001 000000000
谢谢。这很好地解释了它。有没有办法做“memcpy”呢这不依赖于endianness?@user98651
memcpy
不依赖于endianness,是存储在
my_num
中的内容被硬件“反转”。您可以通过调用
my_num=htons(my_num)按网络顺序排列
memcpy
之前,假设您有
。htons方法就是我要找的。谢谢