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

C++ convert int array to int16_t array

本文关键字:数组 int16 转换 int C++      更新时间:2023-10-16

如何在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];
}