我正在爲Win64編寫一個32位程序的DLL插件,編譯爲Win32/Debug在Visual Studio 2015中。我需要離開將一個無符號字符(定義在上游)按56位移位到一個UINT64中,以使0xFF變爲0xFF000000000000。VS上的UINT64左移(64> shift> 32)位僅移位32位
什麼是實際發生的是,對於任何移位值大於32,結果是一個移(移 - 32)位,與我的目標UINT64的高32位成爲全1,因此:
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));
}
...
}
使用VS調試器,我看到了:
m->data[i] == 0xC0
i == 0x7
start_byte == 0
bytes == 8 (so that shift == 8 * (7 - 0) == 56)
then:
r == 0xFFFFFFFFc0000000
我已閱讀:
https://msdn.microsoft.com/en-us/library/336xbhcz.aspx
Left shift an integer by 32 bits
最接近的一個答案,我可以看到的是安德烈Nasonov的答案(https://stackoverflow.com/a/33058550/7817631)於後者,但我是一個64位的機器上(Win7-64上酷睿i5)所以我不希望這是直接相關的。
可能'm-> data [i]'是一個32位值(或更小)。順便說一句,你不應該編輯解決方案的問題,而是你可以發佈答案。 (雖然也許有回答你自己的問題的最低代表要求,IDK)。 –
請不要發佈有問題的答案。你可以[回答](https://stackoverflow.com/help/self-answer)你自己的問題。 –
@MartinZhai根據該鏈接15代表是必需的,所以我猜OP在這種情況下運氣不佳 –