C ++将int数组转换为int16_t数组

时间:2016-07-29 02:46:37

标签: c++ arrays

如何在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]并保留值?

3 个答案:

答案 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];
}