2017-11-07 14 views
0

私は4つの8ビット値を1つの32ビット値に格納するために32ビット変数を使用しています。8ビットMCUでの32ビット可変シフト

32_bit_buf[0]= cmd[9]<<16 | cmd[10]<<8| cmd[11] <<0; 

cmdは、32ビット変数iが0xFFFFBBCCを取得してい印刷されるが、データ

cmd [9]=AA 
cmd[10]=BB 
cmd[11]=CC 

とunsigned char型のものです。

アーキテクチャに8ビットAVR XMEGA

、言語C

私が間違っているつもりだところ、誰もが把握することができます。

+0

これらの変数の定義は重要です。 'int'より小さいすべての値は' int'に最初に昇格されます。 'int'が署名され、あなたが署名ビットに押したときの動作は未定義です。その後、値は32ビットバッファに符号拡張されます。*その定義も重要です。 –

+0

https://stackoverflow.com/questions/2280663/in-ac-expression-where-unsigned-int-and-signed-int-are-present-which-type-will –

+0

@AnttiHaapala符号ビットは*即刻*ここの問題ですが、それは次のものになる可能性があります...私の答えにそれを加えました。 –

答えて

5

アーキテクチャでは16ビットintが使用されているため、16桁分のシフトは未定義です。 cmd[9]をより広いタイプにキャストする。 (uint32_t)cmd[9] << 16が動作するはずです。

あなたはまた、他のコンポーネントにこのキャストを適用する必要があり

:あなたはcmd[10] 8によって場所をシフトするとき、あなたはもっと奇妙につながる、intあなたのオペランドが自動的に昇格されている署名した16ビットの符号ビットにシフトする可能性があり/未定義の動作。

+0

から来たところです。それは感謝しました。 –

0

これは、8ビットのコンテナ(符号なしの文字)で値をシフトして32ビットを取得しようとしているためです。 8ビットの値はint(16ビット)に拡張されますが、まだ十分ではありません。問題はさまざまな形で解決できます。宛先変数をアキュムレータとして使用することができます。

32_bit_buf[0] = cmd[9]; 
32_bit_buf[0] <<= 8; 
32_bit_buf[0] |= cmd[10]; 
32_bit_buf[0] <<= 8; 
32_bit_buf[0] |= cmd[11]; 
+0

申し訳ありませんが、「8bitコンテナ」はありません。オペランドはsigned intに昇格されます。提案された解決策は機能しますが、説明は間違っています。 –

関連する問題