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

Behavior of assigning uint16_t to an index of std::vector<uint8_t>

本文关键字:gt uint8 索引 vector 分配 uint16 std lt      更新时间:2023-10-16
std::vector<uint8_t> v(4);
uint16_t cafe = 0xCAFE;
uint16_t babe = 0xBABE;
v[0] = cafe;
v[2] = babe;

我想要的行为将导致:

v[0] == 0xCA
v[1] == 0xFE
v[2] == 0xBA
v[3] == 0xBE

但是我得到:

v[0] == 0xFE
v[1] == 0x00
v[2] == 0xBE
v[3] == 0x00

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

你的代码没有工作的原因是c++将值转换为uint8_t,你的vector保存的类型:

v[0] = (uint8_t)cafe; // conceptually

v[0] = (uint8_t)(cafe & 0xff); // conceptually

下面的代码可以满足你的要求:

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);

如果你有一个大端机器,不介意你的代码不可移植,并希望做一些极端的性能优化,这样做:

*(uint16_t)&v[0] = cafe;
*(uint16_t)&v[2] = babe;

如果您希望这四个元素具有这四个值,请将这四个元素设置为这些值。这里没有什么神秘之处,除了为什么你希望有其他的工作方式。