将uint16_t分配给 std::vector <uint8_t>索引的行为
Behavior of assigning uint16_t to an index of std::vector<uint8_t>
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;
如果您希望这四个元素具有这四个值,请将这四个元素设置为这些值。这里没有什么神秘之处,除了为什么你希望有其他的工作方式。
相关文章:
- EASTL矢量<向量<int>>连续的
- 从值小于256的uint16到uint8的Endian安全转换
- 你能把一个向量<int64>投射到一个向量<uint8>吗
- SSCANF 进入 uint8 阵列失败
- 着色器将uint8投射到float,并将其重新解释回uint
- 将指针uint8覆盖到指针uint16
- 创建一个包含30亿个uint8元素的向量
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- UINT8/16 /32/etc 和 INT8/16/32/etc 在 libtiff 中不起作用?
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 将具有不同字段的结构转换为 uint8 的数组
- uint32, int16, uint8 .为什么这些常用的数据类型没有进入标准
- C 字符串比较“祝您好运”&gt;“再见”
- 如何将 uint8 列表转换为其相应的有符号值
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 兼容的声明 __attribute__ ((节( ".abc.dfe" ))) 常量易失性 uint8 属性变量 = 0;- 符合MISRA标准
- 如何将UINT8*施放到UINT32
- 如何将元素从 Swift 中的 [UnsafeMutablePointer<UInt8>] 转换为 C++ 中的 UInt8 *
- 从字符串转换为 uint8,反之亦然