将一个16位整数复制到一个两个字节的数组中

5
我想知道为什么当我将一个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;
}

Thanks in advance.


3
您的机器似乎是小端序。连续的字节以“相反”的顺序存储——首先是0x01,然后是0x00 - Frédéric Hamidi
1
看起来字节序阻碍了你的进程,因为你可能得到了 00000001 000000000 - Shark
1个回答

8
这是由于您的平台的字节顺序(endianness)导致的。多字节的uint16_t的字节以最低位字节优先的方式存储在地址空间中。您可以通过使用大于256的数字尝试相同的程序来了解发生了什么。
uint16_t my_num = 0xABCD;

结果的第一个字节为0xCD,第二个字节为0xAB。您可以使用hton/ntoh系列函数来强制指定字节序。

谢谢。这解释得很清楚。有没有一种不依赖于字节序的“memcpy”方法? - user98651
1
@user98651 memcpy 不依赖于字节序,是由硬件“反转”存储在 my_num 中的内容。假设您有 <arpa/inet.h>,您可以在 memcpy 之前调用 my_num = htons(my_num); 将其放入网络顺序中。 - Sergey Kalinichenko
htons方法就是我在寻找的。谢谢。 - user98651

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接