2017-04-05 5 views
1

Visual Studio 2015でWin32/DebugとしてコンパイルされたWin64で32ビットプログラムのDLLプラグインを作成しています。符号なしのchar(上流を定義)をUINT64に56ビットシフトし、0xFFは0xFF000000000000になるはずです。VS内のUINT64で左シフト(64>シフト> 32)ビットだけが32ビットシフトします

実際に何が起こっているのは32より大きい任意のシフト値のために、結果は(シフト - 32)のシフトであるということであるビット、すべての-1となって、私のターゲットUINT64の上位32ビットと、そのように:

m->data[i] == 0xC0 
i == 0x7 
start_byte == 0 
bytes == 8 (so that shift == 8 * (7 - 0) == 56) 

then: 
r == 0xFFFFFFFFc0000000 

私は読んだことがある::VSデバッガを使用して

int  NmeaPgn::sf_get_bytes(TCanMessage *m, UINT8 start_byte, UINT8 bytes) 
{ 
    UINT64 r = 0; /* Could need to fetch up to 8 bytes, as in 60928 */ 
    INT8 i; 

    for (i = start_byte + bytes - 1; i >= start_byte; --i) 
    { 
     r |= (m->data[i] << 8 * (i - start_byte)); 
    } 
... 
} 

、私はのためにことがわかり

https://msdn.microsoft.com/en-us/library/336xbhcz.aspx

C++ bitwise left shift by 32

Left shift an integer by 32 bits

私が見ることができる答えに最も近い(Win7-64コアi5上)、後者にアンドレイNasonovの回答(https://stackoverflow.com/a/33058550/7817631)ですが、私は、64ビットマシン上で午前、私はこれが直接関連性があるとは思わないでしょう。

+0

おそらく 'm-> data [i]'は32ビットの値(またはそれより小さい)です。あなたは答えを投稿する代わりに、質問に答えを編集してはいけません。 (おそらくあなた自身の質問に答えるための最小限の担当者の要件、IDK)があります。 –

+1

質問を投稿しないでください。自分の質問を[答える](https://stackoverflow.com/help/self-answer)することができます。 –

+2

@MartinZhaiそのリンクによると15人が必要なので、OPはこの場合は運がないと思います –

答えて

0

(TomGreenはまだ自分の質問に答えることができないので、ここでの彼の答えはだ)

私は次のように明示的にUINT64への私のunsigned char型にキャストする必要がありました:

r |= ((UINT64)m->data[i] << 8 * (i - start_byte)); 

これは期待値(0xC000000000)を生成ここで、m->data[i] == 0xC0shift == 56です。

関連する問題