C++将int数组转换为int16_t数组
C++ convert int array to int16_t array
如何在C++或C中以低成本将int数组转换为int16_t数组?假设int数组中的所有值都在int16_t的范围内。
我知道两种选择:
i。使用for循环将int数组中的每个元素分配给int16_t数组中的相应元素。
int *a = new int[2];
a[0] = 1;
a[1] = 2;
int16_t *b = new int16_t[2];
for (int i = 0; i < 2; i++) {
b[i] = a[i];
}
但它需要进行复制,并且有开销。
ii。使用铸造
int16_t* c = reinterpret_cast<int16_t*>(a);
//1 0 2 0
for (int i = 0; i < 4; i++) {
cout << (int)r[i] << endl;
}
但我不想要那些0。
有没有其他低成本的方法可以将int array[2]转移到int16_t array[2]并保留这些值?
由于您不能对int
的大小做出任何假设(标准中没有给出任何关于基本数据类型的精确大小的声明),因此您不能在此处使用强制转换来实现任何奇特的技巧。你的例子:
int16_t* c = reinterpret_cast<int16_t*>(a);
不起作用,因为在您的系统上,类型int
恰好是32位长,因此对于每个int
,您将获得两个int16_t
。在您的情况下,碰巧所有值都在某个范围内,所以第二个int16_t
总是0。
我建议只复制你的整数。其他任何事情都是过早的优化。
因为您的目标int16_t由比源int更少的位(32位或更多)表示,所以必须将位从32/64位转换为16位。您的第一个解决方案是正确的,但编译器会在向较小的int赋值时发出警告。赋值右侧的static_cast到int16_t会使警告静音。
是的,我所说的转换是指复制。
您能简单地避免复制并只使用int1_t6
数组吗?
当您增加数组元素的大小时(可能,取决于什么平台),您要么必须复制,要么在每次访问时使用辅助函数/cast。由于这些值仍然较小,除非您需要使用其他int16_t
修改这些值,否则将它们作为int16_t
不会获得任何好处。
我想这真的取决于一旦这些值成为int16_t
,你需要对它们做什么。
int16_t getArrVal( const unsigned index ){
return array[index];
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '