如何在C ++或C中以低成本将int数组转换为int16_t数组?假设int数组中的所有值都在int16_t。
的范围内我知道两个选择:
我。使用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数组[2]并保留值?
答案 0 :(得分:3)
由于您无法对int
的大小做出任何假设(标准不给出关于原始数据类型的完全大小的任何陈述)你不能在这里使用演员阵容做任何花哨的技巧。你的例子:
int16_t* c = reinterpret_cast<int16_t*>(a);
不起作用,因为在您的系统上,int
类型恰好是 32位长,因此对于每个int
,您将获得<强>两个 int16_t
。在您的情况下,所有值都在某个范围内,因此第二个int16_t
始终为0.
我建议只复制你的整数。其他任何事情都是过早的优化。
答案 1 :(得分:0)
因为目标int16_t由比源int(32位或更多)更少的位表示,所以这些位必须从32/64位转换为16位。您的第一个解决方案是正确的,但编译器将警告分配给较小的int。赋值右侧的static_cast到int16_t将使警告静音。
是的,通过转换我的意思是复制。
答案 2 :(得分:-1)
您可以简单地避开副本,只使用int1_t6
数组吗?
当您增加数组元素的大小(可能取决于哪个平台)时,您必须复制或在每次访问时使用辅助函数/强制转换。由于值仍然较小,除非您需要使用其他int16_t
修改值,否则您无法获得将其作为int16_t
的任何内容。
我想这真的取决于你在int16_t
之后需要对这些值做些什么。
int16_t getArrVal( const unsigned index ){
return array[index];
}