2016-07-29 20 views
-4

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

をしたくないですか?

+1

近代的なアーキテクチャでは、値を切り捨てる可能性が高いです。 'int'は32ビットまたは64ビットであり(保証されていませんが、一般的にそうです)、' int16_t'は16ビットであることが保証されています。'int'がシステム上で32ビットであると仮定すると、' int'を** two ** 'int16_t'に変換するので、ポインタを再解釈することはあなたが望むものになることはありません。 – Qix

+0

また、intを切り上げているので、2番目のreinterpret_castの例ではビックエンディアンアーキテクチャで驚くべき結果が得られるかもしれません –

+0

はい。しかし、私は値が16ビット整数(int16_t)の範囲内にあることが保証されていますが、他のコンポーネントからint配列を受け取ります。ですから、もし私がb [i] =(int16_t)a [i]を実行すれば、a [i]は切り捨てられません。 –

答えて

3

あなたはここでキャストを使用して、任意の派手なトリックを行うことはできません(標準ははプリミティブデータ型の正確なサイズについての声明を与えるものではありません)intの大きさについての仮定を行うことができないので。あなたの例:

int16_t* c = reinterpret_cast<int16_t*>(a); 

は動作しませんがため あなたシステム上のタイプ intを使用すると、2つの int16_t を取得する各intためので、32ビットの長であることを起こります。あなたのケースでは、そう、すべての値が一定の範囲内にあることが起こるので、二int16_tは、私はちょうどあなたの整数をコピーすることをお勧め常に0


です。それ以外は早すぎる最適化です。

+1

これは絶対的な正解です。それに私を打つ。 – Qix

+0

私は値が16ビット整数の範囲内にあることが保証されていることを知っています(int16_tまたは私もshortも使用できます)。ただし、32ビットintとして格納されています。コピーにはオーバーヘッドがありますが、コンポーネントには高効率が必要です。 –

+0

メモリレイアウトが一致していない場合、データを再解析する方法はありません。コピー以外に何もできないことはありません。測定前に最適化しないでください!それは早すぎる最適化です。 – nshct

-1

コピーを避け、int1_t6アレイを使用するだけですか?

配列要素のサイズを増やす(多分、どのプラットフォームに依存する)ので、コピーするか、各アクセス時にヘルパー関数/キャストを使用する必要があります。値がまだ小さいので、int16_tの値を変更する必要がなければ、int16_tとしてそれらを持つものは得られません。

私は実際にはint16_tの値を使って何をする必要があるかによって決まると思います。

int16_t getArrVal(const unsigned index){ 
return array[index]; 
} 
0

ターゲットint16_tはソースINTより少ないビット(32ビット以上)で表されるのでビットが16ビットに32/64ビットから変換されなければなりません。あなたの最初の解決策は正しいですが、コンパイラはより小さなintへの代入について警告します。割り当ての右側にあるstatic_castからint16_tは、警告を消音します。

はい、私は変換を意味します。

関連する問題