int配列をint16_t配列にC++またはCで低コストで変換するにはどうすればよいですか? int配列のすべての値がint16_tの範囲内にあるとします。C++ int配列をint16_t配列に変換する
I:
は、私は2つのオプションを知っています。 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。 [2]と値を保つ[2]配列をint16_tするint型の配列を転送するために、他の低コストの方法があります使用することは
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'は32ビットまたは64ビットであり(保証されていませんが、一般的にそうです)、' int16_t'は16ビットであることが保証されています。'int'がシステム上で32ビットであると仮定すると、' int'を** two ** 'int16_t'に変換するので、ポインタを再解釈することはあなたが望むものになることはありません。 – Qix
また、intを切り上げているので、2番目のreinterpret_castの例ではビックエンディアンアーキテクチャで驚くべき結果が得られるかもしれません –
はい。しかし、私は値が16ビット整数(int16_t)の範囲内にあることが保証されていますが、他のコンポーネントからint配列を受け取ります。ですから、もし私がb [i] =(int16_t)a [i]を実行すれば、a [i]は切り捨てられません。 –