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

时间:2014-07-15 08:59:26

标签: c++

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

我应该怎样做才能得到我正在寻找的结果?

2 个答案:

答案 0 :(得分:4)

你的代码不起作用的原因是c ++将值转换为uint8_t,即矢量所持有的类型:

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

如果你有一台big-endian机器,不要忘记你的代码是不可移植的,并且想要做一些极端的性能优化,请执行以下操作:

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

答案 1 :(得分:1)

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