memcpy是否识别目标的基础大小?

时间:2018-02-06 23:33:27

标签: c++ bit-manipulation

#include <iostream>
#include <bitset>
#include <cstring>

using namespace std;

int main()
{
    uint8_t a = 1;
    uint16_t b = 0;

    memcpy(&b, &a, 1);

    cout << bitset<16>(b) << std::endl;

    return 0;
}

此输出为0000000000000001。但是,我希望memcpy只将a复制到b的第一个字节,而将b复制为0000000100000000。这里发生了什么?

2 个答案:

答案 0 :(得分:8)

memcpy为每个参数获取void *,因此它没有关于底层变量类型的信息。它完全复制指定的字节数。

您看到0x0001而不是0x0100的原因可能是因为您的系统使用小端字节排序,这意味着最低有效字节首先出现。

答案 1 :(得分:0)

不,memcpy对缓冲区的大小一无所知,这就是原因 你必须传递你想要复制的字节数。是否缓冲区 足够大,不是memcpy关注的问题。

您只复制 1 字节,只会在b中复制最低有效字节, 这就是你看到0000000000000001

的原因