将字节从较小的类型复制到较大的类型

Amu*_*umu 0 c++ memory

所以,我想保留的两个信息short到一个int用于在网络上发送后(这只是一个演示,这里没有网络代码).我将每个short数字的两个字节复制到prim(原始)变量中.

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>

int main()
{
    unsigned int prim = 0;
    short major = 0x0001;
    short minor = 0x0000;
    prim = 0;
    memcpy(&prim, &major, 2);
    memcpy(&prim+2,&minor, 2);
    std::cout << "Prim: " << prim << std::endl;

    return EXIT_SUCCESS
}
Run Code Online (Sandbox Code Playgroud)

如果我复制第major一个,然后minor(如上面的代码所示),我会得到正确的输出:

Prim: 1
Run Code Online (Sandbox Code Playgroud)

因为我的CPU是小端,二进制表示应该是:

10000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

但是,如果我改变顺序,minor首先意味着更major晚,就像这样:

memcpy(&prim, &minor, 2);
memcpy(&prim+2,&major, 2);
Run Code Online (Sandbox Code Playgroud)

我得到0.

Prim: 0
Run Code Online (Sandbox Code Playgroud)

为什么?它应该是:

00000000 00000000 10000000 00000000
Run Code Online (Sandbox Code Playgroud)

等于65536.

ste*_*anv 5

将整数放入更大整数的更便携方式是通过移位.

uint16_t lo = 1;
uint16_t hi = 2;
uint32_t all = (hi << 16) + lo;
Run Code Online (Sandbox Code Playgroud)