将 uint16_t 分配给 std::vector<uint8_t> 索引的行为

Mic*_*rst 0 c++

std::vector<uint8_t> v(4);
uint16_t cafe = 0xCAFE;
uint16_t babe = 0xBABE;
v[0] = cafe;
v[2] = babe;
Run Code Online (Sandbox Code Playgroud)

我想要的行为会导致:

v[0] == 0xCA
v[1] == 0xFE
v[2] == 0xBA
v[3] == 0xBE
Run Code Online (Sandbox Code Playgroud)

但我得到的是:

v[0] == 0xFE
v[1] == 0x00
v[2] == 0xBE
v[3] == 0x00
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能得到我想要的结果?

ana*_*lyg 5

您的代码不起作用的原因是 c++ 将值转换为uint8_t您的向量保存的类型:

v[0] = (uint8_t)cafe; // conceptually
Run Code Online (Sandbox Code Playgroud)

或者

v[0] = (uint8_t)(cafe & 0xff); // conceptually
Run Code Online (Sandbox Code Playgroud)

以下将做你想做的事:

v[0] = (uint8_t)((cafe >> 8) & 0xff);
v[1] = (uint8_t)((cafe >> 0) & 0xff);
v[2] = (uint8_t)((babe >> 8) & 0xff);
v[3] = (uint8_t)((babe >> 0) & 0xff);
Run Code Online (Sandbox Code Playgroud)

如果您有一台大端机器,不介意您的代码不可移植,并且想要进行一些极端的性能优化,请执行以下操作:

*(uint16_t)&v[0] = cafe;
*(uint16_t)&v[2] = babe;
Run Code Online (Sandbox Code Playgroud)