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
Left shift an integer by 32 bits
私が見ることができる答えに最も近い(Win7-64コアi5上)、後者にアンドレイNasonovの回答(https://stackoverflow.com/a/33058550/7817631)ですが、私は、64ビットマシン上で午前、私はこれが直接関連性があるとは思わないでしょう。
おそらく 'm-> data [i]'は32ビットの値(またはそれより小さい)です。あなたは答えを投稿する代わりに、質問に答えを編集してはいけません。 (おそらくあなた自身の質問に答えるための最小限の担当者の要件、IDK)があります。 –
質問を投稿しないでください。自分の質問を[答える](https://stackoverflow.com/help/self-answer)することができます。 –
@MartinZhaiそのリンクによると15人が必要なので、OPはこの場合は運がないと思います –