2017-11-06 11 views
0

私はこのコードを持っています。ここでwAddressはuint16_t変数へのポインタです。この種の操作は正確には何ですか?

uint8_t upperByte = *wAddress >> 8; 
uint8_t lowerByte = *wAddress; 

最初のシフト操作は、変数の値をwAddressで上書きしますか?

答えて

0

コードがCまたはC++から来たと仮定すると(異なる言語が構文、演算子、および操作の順序を別々に扱うために指摘する価値があると仮定します)、そうでない場合、最初のシフトは変数。むしろシフトはレジスタ内のビットを上書きします。

ASMにコンパイルすると、コードが

uint16_t someInt = 61590; // Binary: 1111 0000 1001 0110 
uint16_t *wAddress = &someInt; 
uint8_t upperByte = *wAddress >> 8; 
uint8_t lowerByte = *wAddress; 

で、これは最初のあるwAddressによって参照値をロードしようとしています。その値がレジスタに入ると、右に8ビットシフトします。つまり、下位8ビットが上位8ビットに置き換えられ、上位8がレジスタ内でゼロで埋められます。すなわち、0000 0000 1111 0000(10進数で240)。その後、その値は新しい下位8ビットに切り捨てられ、upperByte変数の値として保存されます。

この後、someIntの別のコピーがレジスタにロードされ、今回は上位8ビットが破棄され、下位8ビットはlowerByteの値として配置されます(シフトが行われなかったため)。

が実際にsomeIntの値を上書きするには、明示的someInt = *wAddress >> 8;を言わなければならないでしょう、someIntに格納されている値のコピーだけが値がwAddress自体によって指されるのではなく、変更されました。

関連する問題